Skip to content

Commit 6374dc2

Browse files
committed
Merge branch '328-pace-drive-business-starter-new-sdk-handlers' into 'master'
Resolve "[PACE Drive Business Starter] New SDK Handlers" Closes #328 See merge request pace/mobile/android/pace-cloud-sdk!356
2 parents cba3559 + fdcd3f8 commit 6374dc2

File tree

10 files changed

+261
-1
lines changed

10 files changed

+261
-1
lines changed

library/src/main/java/cloud/pace/sdk/appkit/app/webview/AppWebViewModel.kt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import cloud.pace.sdk.appkit.communication.generated.model.request.GooglePayPaym
3232
import cloud.pace.sdk.appkit.communication.generated.model.request.ImageDataRequest
3333
import cloud.pace.sdk.appkit.communication.generated.model.request.LogEventRequest
3434
import cloud.pace.sdk.appkit.communication.generated.model.request.OpenURLInNewTabRequest
35+
import cloud.pace.sdk.appkit.communication.generated.model.request.ReceiptAttachmentsRequest
36+
import cloud.pace.sdk.appkit.communication.generated.model.request.ReceiptEmailRequest
3537
import cloud.pace.sdk.appkit.communication.generated.model.request.SetSecureDataRequest
3638
import cloud.pace.sdk.appkit.communication.generated.model.request.SetTOTPRequest
3739
import cloud.pace.sdk.appkit.communication.generated.model.request.SetUserPropertyRequest
@@ -97,6 +99,12 @@ import cloud.pace.sdk.appkit.communication.generated.model.response.LogoutError
9799
import cloud.pace.sdk.appkit.communication.generated.model.response.LogoutResult
98100
import cloud.pace.sdk.appkit.communication.generated.model.response.OpenURLInNewTabError
99101
import cloud.pace.sdk.appkit.communication.generated.model.response.OpenURLInNewTabResult
102+
import cloud.pace.sdk.appkit.communication.generated.model.response.ReceiptAttachmentsError
103+
import cloud.pace.sdk.appkit.communication.generated.model.response.ReceiptAttachmentsResponse
104+
import cloud.pace.sdk.appkit.communication.generated.model.response.ReceiptAttachmentsResult
105+
import cloud.pace.sdk.appkit.communication.generated.model.response.ReceiptEmailError
106+
import cloud.pace.sdk.appkit.communication.generated.model.response.ReceiptEmailResponse
107+
import cloud.pace.sdk.appkit.communication.generated.model.response.ReceiptEmailResult
100108
import cloud.pace.sdk.appkit.communication.generated.model.response.Result
101109
import cloud.pace.sdk.appkit.communication.generated.model.response.SetSecureDataError
102110
import cloud.pace.sdk.appkit.communication.generated.model.response.SetSecureDataResult
@@ -925,6 +933,30 @@ class AppWebViewModelImpl(
925933
}
926934
}
927935

936+
override suspend fun receiptEmail(timeout: Long?, receiptEmailRequest: ReceiptEmailRequest): ReceiptEmailResult {
937+
return handleAsync(
938+
timeout,
939+
ReceiptEmailResult(ReceiptEmailResult.Failure(ReceiptEmailResult.Failure.StatusCode.RequestTimeout, ReceiptEmailError("Timeout for receiptEmail"))),
940+
ReceiptEmailResult(ReceiptEmailResult.Failure(ReceiptEmailResult.Failure.StatusCode.InternalServerError, ReceiptEmailError("An error occurred")))
941+
) { continuation ->
942+
appModel.onReceiptEmailRequestReceived(receiptEmailRequest.paymentMethod) {
943+
continuation.resumeIfActive(ReceiptEmailResult(ReceiptEmailResult.Success(ReceiptEmailResponse(it))))
944+
}
945+
}
946+
}
947+
948+
override suspend fun receiptAttachments(timeout: Long?, receiptAttachmentsRequest: ReceiptAttachmentsRequest): ReceiptAttachmentsResult {
949+
return handleAsync(
950+
timeout,
951+
ReceiptAttachmentsResult(ReceiptAttachmentsResult.Failure(ReceiptAttachmentsResult.Failure.StatusCode.RequestTimeout, ReceiptAttachmentsError("Timeout for receiptAttachments"))),
952+
ReceiptAttachmentsResult(ReceiptAttachmentsResult.Failure(ReceiptAttachmentsResult.Failure.StatusCode.InternalServerError, ReceiptAttachmentsError("An error occurred")))
953+
) { continuation ->
954+
appModel.onReceiptAttachmentsRequestReceived(receiptAttachmentsRequest.paymentMethod) {
955+
continuation.resumeIfActive(ReceiptAttachmentsResult(ReceiptAttachmentsResult.Success(ReceiptAttachmentsResponse(it))))
956+
}
957+
}
958+
}
959+
928960
private fun handleImageData(image: String): Boolean {
929961
return try {
930962
val decodedString = Base64.decode(image, Base64.DEFAULT)

library/src/main/java/cloud/pace/sdk/appkit/communication/AppCallback.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,22 @@ interface AppCallback {
176176
* @param name The name of the location.
177177
*/
178178
fun onNavigationRequestReceived(lat: Double, lon: Double, name: String)
179+
180+
/**
181+
* Is called when the app asks for an additional email to send the receipt to besides the user's email
182+
*
183+
* @param paymentMethod For which payment method the email is requested
184+
* @param email Call this function to specify an email or not
185+
*/
186+
fun onReceiptEmailRequestReceived(paymentMethod: String, email: (String?) -> Unit)
187+
188+
/**
189+
* Is called when the app asks for additional attachments that should be printed on the fueling receipt
190+
*
191+
* @param paymentMethod For which payment method the attachments are requested
192+
* @param attachments Call this function to specify attachments or not
193+
*/
194+
fun onReceiptAttachmentsRequestReceived(paymentMethod: String, attachments: (List<String>?) -> Unit)
179195
}
180196

181197
abstract class AppCallbackImpl : AppCallback, CloudSDKKoinComponent {
@@ -235,4 +251,12 @@ abstract class AppCallbackImpl : AppCallback, CloudSDKKoinComponent {
235251
override fun onNavigationRequestReceived(lat: Double, lon: Double, name: String) {
236252
appModel.startNavigation(lat, lon)
237253
}
254+
255+
override fun onReceiptEmailRequestReceived(paymentMethod: String, email: (String?) -> Unit) {
256+
email(null)
257+
}
258+
259+
override fun onReceiptAttachmentsRequestReceived(paymentMethod: String, attachments: (List<String>?) -> Unit) {
260+
attachments(null)
261+
}
238262
}

library/src/main/java/cloud/pace/sdk/appkit/communication/AppModel.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ interface AppModel {
7474
fun onGooglePayAvailabilityRequest(request: GooglePayAvailabilityCheckRequest, onResult: (Completion<GooglePayAvailabilityCheckResponse>) -> Unit)
7575
fun onGooglePayPayment(googlePayPaymentRequest: GooglePayPaymentRequest, onResult: (Completion<GooglePayPaymentResponse>) -> Unit)
7676
fun onNavigationRequestReceived(lat: Double, lon: Double, name: String)
77+
fun onReceiptEmailRequestReceived(paymentMethod: String, email: (String?) -> Unit)
78+
fun onReceiptAttachmentsRequestReceived(paymentMethod: String, attachments: (List<String>?) -> Unit)
7779

7880
class Result<T>(val onResult: (T) -> Unit)
7981
}
@@ -386,6 +388,18 @@ class AppModelImpl(
386388
}
387389
}
388390

391+
override fun onReceiptEmailRequestReceived(paymentMethod: String, email: (String?) -> Unit) {
392+
coroutineScope.launch {
393+
callback?.onReceiptEmailRequestReceived(paymentMethod, email)
394+
}
395+
}
396+
397+
override fun onReceiptAttachmentsRequestReceived(paymentMethod: String, attachments: (List<String>?) -> Unit) {
398+
coroutineScope.launch {
399+
callback?.onReceiptAttachmentsRequestReceived(paymentMethod, attachments)
400+
}
401+
}
402+
389403
companion object {
390404
private const val SHARED_DIRECTORY_NAME = "shared"
391405
private const val RECEIPT_FILENAME = "receipt"

library/src/main/java/cloud/pace/sdk/appkit/communication/generated/Communication.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import cloud.pace.sdk.appkit.communication.generated.model.request.GooglePayPaym
1818
import cloud.pace.sdk.appkit.communication.generated.model.request.ImageDataRequest
1919
import cloud.pace.sdk.appkit.communication.generated.model.request.LogEventRequest
2020
import cloud.pace.sdk.appkit.communication.generated.model.request.OpenURLInNewTabRequest
21+
import cloud.pace.sdk.appkit.communication.generated.model.request.ReceiptAttachmentsRequest
22+
import cloud.pace.sdk.appkit.communication.generated.model.request.ReceiptEmailRequest
2123
import cloud.pace.sdk.appkit.communication.generated.model.request.SetSecureDataRequest
2224
import cloud.pace.sdk.appkit.communication.generated.model.request.SetTOTPRequest
2325
import cloud.pace.sdk.appkit.communication.generated.model.request.SetUserPropertyRequest
@@ -48,6 +50,8 @@ import cloud.pace.sdk.appkit.communication.generated.model.response.IsSignedInRe
4850
import cloud.pace.sdk.appkit.communication.generated.model.response.LogEventResult
4951
import cloud.pace.sdk.appkit.communication.generated.model.response.LogoutResult
5052
import cloud.pace.sdk.appkit.communication.generated.model.response.OpenURLInNewTabResult
53+
import cloud.pace.sdk.appkit.communication.generated.model.response.ReceiptAttachmentsResult
54+
import cloud.pace.sdk.appkit.communication.generated.model.response.ReceiptEmailResult
5155
import cloud.pace.sdk.appkit.communication.generated.model.response.SetSecureDataResult
5256
import cloud.pace.sdk.appkit.communication.generated.model.response.SetTOTPResult
5357
import cloud.pace.sdk.appkit.communication.generated.model.response.SetUserPropertyResult
@@ -345,4 +349,25 @@ public interface Communication {
345349
* @param shareFileRequest The shareFile request body object
346350
*/
347351
public suspend fun shareFile(timeout: Long?, shareFileRequest: ShareFileRequest): ShareFileResult
352+
353+
/**
354+
* Asks the client for an optional additional receipt email.
355+
*
356+
* @param timeout The timeout of receiptEmail in milliseconds or null if no timeout should be used
357+
* @param receiptEmailRequest The receiptEmail request body object
358+
*/
359+
public suspend fun receiptEmail(timeout: Long?, receiptEmailRequest: ReceiptEmailRequest):
360+
ReceiptEmailResult
361+
362+
/**
363+
* Asks the client for optional attachments to be included in the fueling receipt.
364+
*
365+
* @param timeout The timeout of receiptAttachments in milliseconds or null if no timeout should
366+
* be used
367+
* @param receiptAttachmentsRequest The receiptAttachments request body object
368+
*/
369+
public suspend fun receiptAttachments(
370+
timeout: Long?,
371+
receiptAttachmentsRequest: ReceiptAttachmentsRequest
372+
): ReceiptAttachmentsResult
348373
}

library/src/main/java/cloud/pace/sdk/appkit/communication/generated/CommunicationManager.kt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import cloud.pace.sdk.appkit.communication.generated.model.request.GooglePayPaym
1818
import cloud.pace.sdk.appkit.communication.generated.model.request.ImageDataRequest
1919
import cloud.pace.sdk.appkit.communication.generated.model.request.LogEventRequest
2020
import cloud.pace.sdk.appkit.communication.generated.model.request.OpenURLInNewTabRequest
21+
import cloud.pace.sdk.appkit.communication.generated.model.request.ReceiptAttachmentsRequest
22+
import cloud.pace.sdk.appkit.communication.generated.model.request.ReceiptEmailRequest
2123
import cloud.pace.sdk.appkit.communication.generated.model.request.Request
2224
import cloud.pace.sdk.appkit.communication.generated.model.request.SetSecureDataRequest
2325
import cloud.pace.sdk.appkit.communication.generated.model.request.SetTOTPRequest
@@ -672,6 +674,56 @@ public data class CommunicationManager(
672674
}
673675
}
674676

677+
"/receiptEmail" -> {
678+
CoroutineScope(Dispatchers.Default).launch {
679+
val timeout = (request.header?.get("Keep-Alive") as? Double)?.toLong()?.let {
680+
TimeUnit.SECONDS.toMillis(it)
681+
}
682+
val receiptEmailRequest = gson.fromJson<ReceiptEmailRequest>(message)
683+
val body = receiptEmailRequest?.body
684+
if (body == null) {
685+
withContext(Dispatchers.Main) {
686+
respond(
687+
Response(
688+
request.id, HttpURLConnection.HTTP_BAD_REQUEST, request.header,
689+
Message("Could not deserialize the JSON request message")
690+
)
691+
)
692+
}
693+
} else {
694+
val result = listener.receiptEmail(timeout, body)
695+
withContext(Dispatchers.Main) {
696+
respond(Response(request.id, result.status, request.header, result.body))
697+
}
698+
}
699+
}
700+
}
701+
702+
"/receiptAttachments" -> {
703+
CoroutineScope(Dispatchers.Default).launch {
704+
val timeout = (request.header?.get("Keep-Alive") as? Double)?.toLong()?.let {
705+
TimeUnit.SECONDS.toMillis(it)
706+
}
707+
val receiptAttachmentsRequest = gson.fromJson<ReceiptAttachmentsRequest>(message)
708+
val body = receiptAttachmentsRequest?.body
709+
if (body == null) {
710+
withContext(Dispatchers.Main) {
711+
respond(
712+
Response(
713+
request.id, HttpURLConnection.HTTP_BAD_REQUEST, request.header,
714+
Message("Could not deserialize the JSON request message")
715+
)
716+
)
717+
}
718+
} else {
719+
val result = listener.receiptAttachments(timeout, body)
720+
withContext(Dispatchers.Main) {
721+
respond(Response(request.id, result.status, request.header, result.body))
722+
}
723+
}
724+
}
725+
}
726+
675727
else -> {
676728
CoroutineScope(Dispatchers.Main).launch {
677729
respond(

library/src/main/java/cloud/pace/sdk/appkit/communication/generated/Metadata.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public object Metadata {
2525
"/applePayAvailabilityCheck", "/back", "/appInterceptableLink", "/setUserProperty",
2626
"/logEvent", "/getConfig", "/getTraceId", "/getLocation", "/appRedirect",
2727
"/isBiometricAuthEnabled", "/isSignedIn", "/isRemoteConfigAvailable", "/shareText",
28-
"/googlePayAvailabilityCheck", "/googlePayPayment", "/startNavigation", "/shareFile"
28+
"/googlePayAvailabilityCheck", "/googlePayPayment", "/startNavigation", "/shareFile",
29+
"/receiptEmail", "/receiptAttachments"
2930
)
3031
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// Generated by KotlinPoet:
3+
// https://github.com/square/kotlinpoet
4+
//
5+
// Please do not edit!
6+
//
7+
package cloud.pace.sdk.appkit.communication.generated.model.request
8+
9+
public data class ReceiptAttachmentsRequest(
10+
/**
11+
* The id of the user payment method.
12+
*/
13+
public val paymentMethod: String
14+
)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// Generated by KotlinPoet:
3+
// https://github.com/square/kotlinpoet
4+
//
5+
// Please do not edit!
6+
//
7+
package cloud.pace.sdk.appkit.communication.generated.model.request
8+
9+
public data class ReceiptEmailRequest(
10+
/**
11+
* The id of the user payment method.
12+
*/
13+
public val paymentMethod: String
14+
)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//
2+
// Generated by KotlinPoet:
3+
// https://github.com/square/kotlinpoet
4+
//
5+
// Please do not edit!
6+
//
7+
package cloud.pace.sdk.appkit.communication.generated.model.response
8+
9+
public data class ReceiptAttachmentsResponse(
10+
public val attachments: List<String>?
11+
) : ResponseBody()
12+
13+
public data class ReceiptAttachmentsError(
14+
public val message: String? = null
15+
) : ResponseBody()
16+
17+
public class ReceiptAttachmentsResult private constructor(
18+
status: Int,
19+
body: ResponseBody?
20+
) : Result(status, body) {
21+
public constructor(success: Success) : this(200, success.response)
22+
23+
public constructor(failure: Failure) : this(failure.statusCode.code, failure.response)
24+
25+
public class Success(
26+
public val response: ReceiptAttachmentsResponse
27+
)
28+
29+
public class Failure(
30+
public val statusCode: StatusCode,
31+
public val response: ReceiptAttachmentsError
32+
) {
33+
public enum class StatusCode(
34+
public val code: Int
35+
) {
36+
BadRequest(400),
37+
RequestTimeout(408),
38+
InternalServerError(500),
39+
;
40+
}
41+
}
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//
2+
// Generated by KotlinPoet:
3+
// https://github.com/square/kotlinpoet
4+
//
5+
// Please do not edit!
6+
//
7+
package cloud.pace.sdk.appkit.communication.generated.model.response
8+
9+
public data class ReceiptEmailResponse(
10+
public val email: String?
11+
) : ResponseBody()
12+
13+
public data class ReceiptEmailError(
14+
public val message: String? = null
15+
) : ResponseBody()
16+
17+
public class ReceiptEmailResult private constructor(
18+
status: Int,
19+
body: ResponseBody?
20+
) : Result(status, body) {
21+
public constructor(success: Success) : this(200, success.response)
22+
23+
public constructor(failure: Failure) : this(failure.statusCode.code, failure.response)
24+
25+
public class Success(
26+
public val response: ReceiptEmailResponse
27+
)
28+
29+
public class Failure(
30+
public val statusCode: StatusCode,
31+
public val response: ReceiptEmailError
32+
) {
33+
public enum class StatusCode(
34+
public val code: Int
35+
) {
36+
BadRequest(400),
37+
RequestTimeout(408),
38+
InternalServerError(500),
39+
;
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)