diff --git a/libs/sdk-bindings/bindings-android/lib/src/main/kotlin/breez_sdk_notification/job/RedeemSwap.kt b/libs/sdk-bindings/bindings-android/lib/src/main/kotlin/breez_sdk_notification/job/RedeemSwap.kt index 54113b2af..2d232339d 100644 --- a/libs/sdk-bindings/bindings-android/lib/src/main/kotlin/breez_sdk_notification/job/RedeemSwap.kt +++ b/libs/sdk-bindings/bindings-android/lib/src/main/kotlin/breez_sdk_notification/job/RedeemSwap.kt @@ -25,6 +25,7 @@ class RedeemSwapJob( private val fgService: SdkForegroundService, private val payload: String, private val logger: ServiceLogger, + private var bitcoinAddress: String? = null, ) : Job { companion object { private const val TAG = "RedeemSwapJob" @@ -33,32 +34,43 @@ class RedeemSwapJob( override fun start(breezSDK: BlockingBreezServices) { try { val request = Json.decodeFromString(AddressTxsConfirmedRequest.serializer(), payload) + this.bitcoinAddress = request.address breezSDK.redeemSwap(request.address) logger.log(TAG, "Found swap for ${request.address}", "INFO") - notifyChannel( - context, - NOTIFICATION_CHANNEL_SWAP_TX_CONFIRMED, - getString( - context, - SWAP_TX_CONFIRMED_NOTIFICATION_TITLE, - DEFAULT_SWAP_TX_CONFIRMED_NOTIFICATION_TITLE - ), - ) } catch (e: Exception) { - logger.log(TAG, "Failed to process swap notification: ${e.message}", "WARN") - notifyChannel( - context, - NOTIFICATION_CHANNEL_SWAP_TX_CONFIRMED, - getString( - context, - SWAP_TX_CONFIRMED_NOTIFICATION_FAILURE_TITLE, - DEFAULT_SWAP_TX_CONFIRMED_NOTIFICATION_FAILURE_TITLE - ), - ) + logger.log(TAG, "Failed to manually reedeem swap notification: ${e.message}", "WARN") } + } - fgService.shutdown() + override fun onEvent(e: BreezEvent) { + this.bitcoinAddress?.let {address -> + when (e) { + is BreezEvent.SwapUpdated -> { + val swapInfo = e.details + logger.log(TAG, "Received swap updated event: ${swapInfo.bitcoinAddress} current address: ${address} status: ${swapInfo.status}", "TRACE") + if (swapInfo.bitcoinAddress == address) { + if (swapInfo.paidMsat.toLong() > 0) { + notifySuccessAndShutdown() + } + } + } + + else -> {} + } + } } - override fun onEvent(e: BreezEvent) {} + private fun notifySuccessAndShutdown() { + logger.log(TAG, "Swap address redeemed succesfully", "INFO") + notifyChannel( + context, + NOTIFICATION_CHANNEL_SWAP_TX_CONFIRMED, + getString( + context, + SWAP_TX_CONFIRMED_NOTIFICATION_TITLE, + DEFAULT_SWAP_TX_CONFIRMED_NOTIFICATION_TITLE + ), + ) + fgService.shutdown() + } } diff --git a/libs/sdk-bindings/bindings-swift/Sources/BreezSDKNotification/Task/RedeemSwap.swift b/libs/sdk-bindings/bindings-swift/Sources/BreezSDKNotification/Task/RedeemSwap.swift index 8d3565892..a534845f9 100644 --- a/libs/sdk-bindings/bindings-swift/Sources/BreezSDKNotification/Task/RedeemSwap.swift +++ b/libs/sdk-bindings/bindings-swift/Sources/BreezSDKNotification/Task/RedeemSwap.swift @@ -1,5 +1,6 @@ import UserNotifications import Foundation +import BreezSDK struct AddressTxsConfirmedRequest: Codable { let address: String @@ -12,7 +13,7 @@ class RedeemSwapTask : TaskProtocol { internal var contentHandler: ((UNNotificationContent) -> Void)? internal var bestAttemptContent: UNMutableNotificationContent? internal var logger: ServiceLogger - internal var receivedPayment: Payment? = nil + internal var swapAddress: String? = nil init(payload: String, logger: ServiceLogger, contentHandler: ((UNNotificationContent) -> Void)? = nil, bestAttemptContent: UNMutableNotificationContent? = nil) { self.payload = payload @@ -21,26 +22,44 @@ class RedeemSwapTask : TaskProtocol { self.logger = logger } - public func onEvent(e: BreezEvent) {} + public func onEvent(e: BreezEvent) { + if let address = self.swapAddress { + switch e { + case .swapUpdated(details: let swapInfo): + self.logger.log(tag: TAG, line: "Received swap updated event: \(swapInfo.bitcoinAddress), current address: \(address) status: \(swapInfo.status)\n", level: "INFO") + if address == swapInfo.bitcoinAddress { + if (swapInfo.paidMsat > 0) { + let successRedeemSwap = ResourceHelper.shared.getString(key: Constants.SWAP_TX_CONFIRMED_NOTIFICATION_TITLE, fallback: Constants.DEFAULT_SWAP_TX_CONFIRMED_NOTIFICATION_TITLE) + self.displayPushNotification(title: successRedeemSwap, logger: self.logger, threadIdentifier: Constants.NOTIFICATION_THREAD_SWAP_TX_CONFIRMED) + } + } + break + default: + break + } + } + } func start(breezSDK: BlockingBreezServices) throws { - var addressTxsConfirmedRequest: AddressTxsConfirmedRequest? = nil do { - addressTxsConfirmedRequest = try JSONDecoder().decode(AddressTxsConfirmedRequest.self, from: self.payload.data(using: .utf8)!) + let addressTxsConfirmedRequest = try JSONDecoder().decode(AddressTxsConfirmedRequest.self, from: self.payload.data(using: .utf8)!) + swapAddress = addressTxsConfirmedRequest.address } catch let e { self.logger.log(tag: TAG, line: "failed to decode payload: \(e)", level: "ERROR") self.onShutdown() throw e } - + + guard let address = swapAddress else { + self.logger.log(tag: TAG, line: "Failed to process swap notification: swap address not in payload", level: "ERROR") + self.onShutdown() + } + do { - try breezSDK.redeemSwap(swapAddress: addressTxsConfirmedRequest!.address) - self.logger.log(tag: TAG, line: "Found swap for \(addressTxsConfirmedRequest!.address)", level: "DEBUG") - let successRedeemSwap = ResourceHelper.shared.getString(key: Constants.SWAP_TX_CONFIRMED_NOTIFICATION_TITLE, fallback: Constants.DEFAULT_SWAP_TX_CONFIRMED_NOTIFICATION_TITLE) - self.displayPushNotification(title: successRedeemSwap, logger: self.logger, threadIdentifier: Constants.NOTIFICATION_THREAD_SWAP_TX_CONFIRMED) + try breezSDK.redeemSwap(swapAddress: address) + self.logger.log(tag: TAG, line: "Found swap for \(address)", level: "DEBUG") } catch let e { - self.logger.log(tag: TAG, line: "Failed to process swap notification: \(e)", level: "ERROR") - self.onShutdown() + self.logger.log(tag: TAG, line: "Failed to manually redeem swap notification: \(e)", level: "ERROR") } }