Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ internal data class NativeAlternativePaymentRequestBody(
val gatewayConfigurationId: String,
val source: String?,
@Json(name = "submit_data")
val submitData: SubmitData?
val submitData: SubmitData?,
@Json(name = "redirect")
val redirectConfirmation: PONativeAlternativePaymentRedirectConfirmation?
) {

@JsonClass(generateAdapter = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ package com.processout.sdk.api.model.request.napm.v2
* @param[gatewayConfigurationId] Gateway configuration identifier.
* @param[source] Payment source.
* @param[submitData] Payment payload.
* @param[redirectConfirmation] Redirect confirmation.
*/
data class PONativeAlternativePaymentAuthorizationRequest(
val invoiceId: String,
val gatewayConfigurationId: String,
val source: String? = null,
val submitData: PONativeAlternativePaymentSubmitData? = null
val submitData: PONativeAlternativePaymentSubmitData? = null,
val redirectConfirmation: PONativeAlternativePaymentRedirectConfirmation? = null
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.processout.sdk.api.model.request.napm.v2

import com.squareup.moshi.JsonClass

/**
* Specifies native alternative payment redirect confirmation.
*
* @param[success] Indicates whether the redirection was successful.
*/
@JsonClass(generateAdapter = true)
data class PONativeAlternativePaymentRedirectConfirmation(
val success: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ package com.processout.sdk.api.model.request.napm.v2
* @param[customerTokenId] Customer token identifier.
* @param[gatewayConfigurationId] Gateway configuration identifier.
* @param[submitData] Payment payload.
* @param[redirectConfirmation] Redirect confirmation.
*/
data class PONativeAlternativePaymentTokenizationRequest(
val customerId: String,
val customerTokenId: String,
val gatewayConfigurationId: String,
val submitData: PONativeAlternativePaymentSubmitData? = null
val submitData: PONativeAlternativePaymentSubmitData? = null,
val redirectConfirmation: PONativeAlternativePaymentRedirectConfirmation? = null
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package com.processout.sdk.api.model.response.napm.v2

import android.os.Parcelable
import com.processout.sdk.api.model.request.napm.v2.PONativeAlternativePaymentAuthorizationRequest
import com.processout.sdk.api.model.request.napm.v2.PONativeAlternativePaymentRedirectConfirmation
import com.processout.sdk.api.model.request.napm.v2.PONativeAlternativePaymentTokenizationRequest
import com.processout.sdk.core.annotation.ProcessOutInternalApi
import com.processout.sdk.core.util.findBy
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import kotlinx.parcelize.Parcelize

Expand All @@ -9,10 +15,43 @@ import kotlinx.parcelize.Parcelize
*
* @param[url] Redirect URL.
* @param[hint] A hint or description associated with the redirect URL.
* @param[rawType] Raw redirect type.
* @param[confirmationRequired] Indicates whether it is required to notify the backend if the redirection was successful
* by sending [PONativeAlternativePaymentRedirectConfirmation]
* in the [PONativeAlternativePaymentAuthorizationRequest.redirectConfirmation]
* or the [PONativeAlternativePaymentTokenizationRequest.redirectConfirmation],
* depending on the flow.
*/
@Parcelize
@JsonClass(generateAdapter = true)
data class PONativeAlternativePaymentRedirect(
val url: String,
val hint: String
) : Parcelable
val hint: String,
@Json(name = "type")
val rawType: String,
@Json(name = "confirmation_required")
val confirmationRequired: Boolean
) : Parcelable {

/** Redirect type. */
val type: RedirectType
get() = RedirectType::rawType.findBy(rawType) ?: RedirectType.UNKNOWN

/**
* Redirect type.
*/
enum class RedirectType(val rawType: String) {
/** Web redirect. */
WEB("web"),

/** Deep link redirect. */
DEEP_LINK("deep_link"),

/**
* Placeholder that allows adding additional cases while staying backward compatible.
* __Warning:__ Do not match this case directly, use _when-else_ instead.
*/
@ProcessOutInternalApi
UNKNOWN(String())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ internal class DefaultCustomerTokensRepository(
NativeAlternativePaymentRequestBody(
gatewayConfigurationId = gatewayConfigurationId,
source = null,
submitData = submitData?.let { SubmitData(parameters = it.parameters.map()) }
submitData = submitData?.let { SubmitData(parameters = it.parameters.map()) },
redirectConfirmation = redirectConfirmation
)

private fun Map<String, Parameter>.map() =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,8 @@ internal class DefaultInvoicesRepository(
NativeAlternativePaymentRequestBody(
gatewayConfigurationId = gatewayConfigurationId,
source = source,
submitData = submitData?.let { SubmitData(parameters = it.parameters.map()) }
submitData = submitData?.let { SubmitData(parameters = it.parameters.map()) },
redirectConfirmation = redirectConfirmation
)

private fun Map<String, Parameter>.map() =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,7 @@ internal class DynamicCheckoutInteractor(
}
when (paymentMethod) {
is NativeAlternativePayment -> nativeAlternativePayment.onEvent(
NativeAlternativePaymentEvent.RedirectResult(result)
NativeAlternativePaymentEvent.WebRedirectResult(result)
)
else -> result.onSuccess { response ->
authorizeInvoice(
Expand Down Expand Up @@ -1143,7 +1143,7 @@ internal class DynamicCheckoutInteractor(
_sideEffects.send(permissionRequest)
POLogger.info("System permission requested: %s", permissionRequest)
}
is NativeAlternativePaymentSideEffect.Redirect ->
is NativeAlternativePaymentSideEffect.WebRedirect ->
activePaymentMethod()?.let { paymentMethod ->
_state.update { it.copy(processingPaymentMethod = paymentMethod) }
_sideEffects.send(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,7 @@ private fun NativeAlternativePaymentEvent.map(
is NativeAlternativePaymentEvent.ActionConfirmationRequested -> ActionConfirmationRequested(id = id)
is NativeAlternativePaymentEvent.Dismiss -> Dismiss(failure = failure)
is NativeAlternativePaymentEvent.PermissionRequestResult,
is NativeAlternativePaymentEvent.RedirectResult -> null // Ignore, handled by dynamic checkout events.
is NativeAlternativePaymentEvent.WebRedirectResult -> null // Ignore, handled by dynamic checkout events.
}

internal object DynamicCheckoutScreen {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import com.processout.sdk.ui.napm.NativeAlternativePaymentCompletion.Failure
import com.processout.sdk.ui.napm.NativeAlternativePaymentCompletion.Success
import com.processout.sdk.ui.napm.NativeAlternativePaymentEvent.*
import com.processout.sdk.ui.napm.NativeAlternativePaymentSideEffect.PermissionRequest
import com.processout.sdk.ui.napm.NativeAlternativePaymentSideEffect.Redirect
import com.processout.sdk.ui.napm.NativeAlternativePaymentSideEffect.WebRedirect
import com.processout.sdk.ui.napm.NativeAlternativePaymentViewModelState.Loaded
import com.processout.sdk.ui.napm.NativeAlternativePaymentViewModelState.Stage
import com.processout.sdk.ui.napm.PONativeAlternativePaymentConfiguration.Flow
Expand Down Expand Up @@ -83,7 +83,7 @@ internal class NativeAlternativePaymentBottomSheet : BaseBottomSheetDialogFragme
alternativePaymentLauncher = POAlternativePaymentMethodCustomTabLauncher.create(
from = this,
callback = { result ->
viewModel.onEvent(RedirectResult(result))
viewModel.onEvent(WebRedirectResult(result))
}
)
viewModel.start()
Expand Down Expand Up @@ -137,7 +137,7 @@ internal class NativeAlternativePaymentBottomSheet : BaseBottomSheetDialogFragme
private fun handle(sideEffect: NativeAlternativePaymentSideEffect) {
when (sideEffect) {
is PermissionRequest -> requestPermission(sideEffect.permission)
is Redirect -> alternativePaymentLauncher.launch(
is WebRedirect -> alternativePaymentLauncher.launch(
uri = sideEffect.redirectUrl.toUri(),
returnUrl = sideEffect.returnUrl
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ internal sealed interface NativeAlternativePaymentEvent {
data class ActionConfirmationRequested(val id: String) : NativeAlternativePaymentEvent
data class Dismiss(val failure: ProcessOutResult.Failure) : NativeAlternativePaymentEvent
data class PermissionRequestResult(val permission: String, val isGranted: Boolean) : NativeAlternativePaymentEvent
data class RedirectResult(
data class WebRedirectResult(
val result: ProcessOutResult<POAlternativePaymentMethodResponse>
) : NativeAlternativePaymentEvent
}

internal sealed interface NativeAlternativePaymentSideEffect {
data class PermissionRequest(val permission: String) : NativeAlternativePaymentSideEffect
data class Redirect(
data class WebRedirect(
val redirectUrl: String,
val returnUrl: String
) : NativeAlternativePaymentSideEffect
Expand Down
Loading