Skip to content

Commit 8be9e2a

Browse files
authored
Update SDK to version 7.1.0 (#280)
* With support for target SDK 36 * With support for Android Gradle Plugin 9.x * Integrate Activity Result API for Login, CardReaderPage and Checkout
1 parent 2f188da commit 8be9e2a

9 files changed

Lines changed: 56 additions & 59 deletions

File tree

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
# Changelog
22

33
For more information, see the [README](https://github.com/sumup/Android-MerchantSDK/blob/master/README.md)
4+
5+
## Version 7.1.0
6+
* [ADDED] Support for target SDK 36.
7+
* [ADDED] Support for Android Gradle Plugin 9.x.
8+
* [ADDED] SumUpLoginContract, SumUpCardReaderPageContract, and SumUpCheckoutContract to support Activity Result API integrations. Existing onActivityResult-based integrations remain unchanged. Please refer to the documentation for more information.
9+
* [IMPROVEMENT] Reduced SDK size by approximately 8 MB.
10+
* [IMPROVEMENT] In offline sessions, totalApprovedAmount now includes tip amounts.
11+
* **Important:** SDK v7.1.0 introduces internal changes that are not backward compatible. After upgrading and running the application with v7.1.0, downgrading to an earlier SDK version is not supported.
12+
413
## Version 7.0.0
514
* [ADDED] `successScreenTimeout` in the payment builder to configure the duration of the success screen.
615
* [ADDED] `getSavedCardReaderDetails()` to retrieve details of the saved card reader (serial number, type, and battery percentage).

app/build.gradle.kts

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
plugins {
22
id("com.android.application")
3-
id("org.jetbrains.kotlin.android")
43
id("org.jetbrains.kotlin.plugin.compose")
54
}
65

76
android {
87
namespace = "com.sumup.app"
9-
compileSdk = 35
8+
compileSdk = 36
109

1110
defaultConfig {
1211
applicationId = "com.sumup.sdksampleapp"
1312
minSdk = 26
14-
targetSdk = 35
13+
targetSdk = 36
1514
versionCode = 1
16-
versionName = "7.0.0"
15+
versionName = "7.1.0"
1716
}
1817

1918
packaging {
@@ -29,15 +28,11 @@ android {
2928
sourceCompatibility = JavaVersion.VERSION_17
3029
targetCompatibility = JavaVersion.VERSION_17
3130
}
32-
33-
kotlinOptions {
34-
jvmTarget = "17"
35-
}
36-
3731
buildTypes {
3832
debug {
3933
// All ProGuard rules required by the SumUp SDK are packaged with the library
4034
isMinifyEnabled = true
35+
isShrinkResources = true
4136
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"))
4237
}
4338
}
@@ -47,26 +42,30 @@ android {
4742
}
4843
}
4944

45+
kotlin {
46+
jvmToolchain(17)
47+
}
48+
5049
dependencies {
51-
implementation(platform("androidx.compose:compose-bom:2025.04.01"))
52-
implementation("androidx.core:core-ktx:1.15.0")
53-
implementation("androidx.activity:activity-compose:1.9.3")
50+
implementation(platform("androidx.compose:compose-bom:2026.05.01"))
51+
implementation("androidx.core:core-ktx:1.18.0")
52+
implementation("androidx.activity:activity-compose:1.13.0")
5453
implementation("androidx.compose.ui:ui")
5554
implementation("androidx.compose.ui:ui-tooling-preview")
5655
implementation("androidx.compose.material3:material3")
5756
implementation("androidx.compose.material:material-icons-extended")
58-
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7")
59-
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.7")
60-
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7")
57+
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.10.0")
58+
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.10.0")
59+
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.10.0")
6160

62-
implementation("androidx.navigation:navigation-compose:2.8.5")
61+
implementation("androidx.navigation:navigation-compose:2.9.8")
6362

64-
implementation("io.insert-koin:koin-android:3.5.6")
65-
implementation("io.insert-koin:koin-androidx-compose:3.5.6")
63+
implementation("io.insert-koin:koin-android:4.2.2")
64+
implementation("io.insert-koin:koin-androidx-compose:4.2.2")
6665

67-
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1")
66+
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0")
6867

69-
implementation("com.sumup:merchant-sdk:7.0.0")
68+
implementation("com.sumup:merchant-sdk:7.1.0")
7069
implementation("com.google.android.gms:play-services-location:21.3.0")
7170

7271
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")

app/src/main/java/com/sumup/app/data/mapper/OfflineSessionMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.sumup.app.data.mapper
22

33
import com.sumup.app.domain.model.OfflineSession
4-
import com.sumup.merchant.reader.offline.OfflineSessionState
4+
import com.sumup.contract.offline.OfflineSessionState
55

66
internal class OfflineSessionMapper {
77

app/src/main/java/com/sumup/app/data/repository/ReaderSdkRepositoryImpl.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import com.sumup.app.domain.model.MerchantInfo
99
import com.sumup.app.domain.model.OfflineSdkError
1010
import com.sumup.app.domain.model.OfflineSession
1111
import com.sumup.app.domain.repository.ReaderSdkRepository
12+
import com.sumup.contract.offline.OfflineSessionState
13+
import com.sumup.contract.offline.OfflineUploadFailureReasons
1214
import com.sumup.merchant.reader.api.SumUpAPI
13-
import com.sumup.merchant.reader.offline.OfflineSessionState
14-
import com.sumup.merchant.reader.offline.OfflineUploadFailureReasons
1515
import com.sumup.merchant.reader.offline.callbacks.OfflineSessionCallback
1616
import com.sumup.merchant.reader.offline.callbacks.SecurityPatchUpdateCallback
1717
import com.sumup.merchant.reader.offline.callbacks.UploadOfflineTransactionsStatusListener
@@ -29,6 +29,7 @@ import kotlinx.coroutines.suspendCancellableCoroutine
2929
import kotlinx.coroutines.withContext
3030
import kotlin.coroutines.resume
3131
import kotlin.coroutines.resumeWithException
32+
import kotlin.time.Duration.Companion.milliseconds
3233

3334
internal class ReaderSdkRepositoryImpl(
3435
private val dispatcherProvider: CoroutinesDispatcherProvider,
@@ -59,7 +60,7 @@ internal class ReaderSdkRepositoryImpl(
5960
override fun connectedReaderFlow(intervalMs: Long): Flow<ConnectedReader?> = flow {
6061
emit(snapshotConnectedReader())
6162
while (true) {
62-
delay(intervalMs)
63+
delay(intervalMs.milliseconds)
6364
emit(snapshotConnectedReader())
6465
}
6566
}

app/src/main/java/com/sumup/app/di/KoinModules.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.sumup.app.di
22

3-
import com.sumup.app.util.CoroutinesDispatcherProvider
4-
import com.sumup.app.util.DefaultCoroutinesDispatcherProvider
53
import com.sumup.app.data.mapper.ConnectedReaderMapper
64
import com.sumup.app.data.mapper.MerchantInfoMapper
75
import com.sumup.app.data.mapper.OfflineSessionMapper
@@ -12,7 +10,9 @@ import com.sumup.app.domain.usecase.CreateLoginRequestUseCase
1210
import com.sumup.app.domain.usecase.ParsePaymentResultUseCase
1311
import com.sumup.app.domain.usecase.ParseSdkStatusUseCase
1412
import com.sumup.app.presentation.MainViewModel
15-
import org.koin.androidx.viewmodel.dsl.viewModel
13+
import com.sumup.app.util.CoroutinesDispatcherProvider
14+
import com.sumup.app.util.DefaultCoroutinesDispatcherProvider
15+
import org.koin.core.module.dsl.viewModel
1616
import org.koin.dsl.module
1717

1818
internal val appModule = module {
@@ -42,7 +42,6 @@ internal val appModule = module {
4242
parseSdkStatusUseCase = get(),
4343
parsePaymentResultUseCase = get(),
4444
readerSdkRepository = get(),
45-
dispatcherProvider = get(),
4645
)
4746
}
4847
}

app/src/main/java/com/sumup/app/presentation/MainActivity.kt

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,24 @@ import com.sumup.app.presentation.screen.CheckoutScreen
2727
import com.sumup.app.presentation.screen.SettingsScreen
2828
import com.sumup.app.presentation.screen.WelcomeScreen
2929
import com.sumup.app.presentation.theme.AppTheme
30-
import com.sumup.merchant.reader.api.SumUpAPI
30+
import com.sumup.merchant.reader.api.SumUpCardReaderPageContract
31+
import com.sumup.merchant.reader.api.SumUpCheckoutContract
32+
import com.sumup.merchant.reader.api.SumUpLoginContract
3133
import org.koin.androidx.viewmodel.ext.android.viewModel
3234

3335
class MainActivity : ComponentActivity() {
3436
private val viewModel: MainViewModel by viewModel()
3537

38+
private val loginLauncher = registerForActivityResult(SumUpLoginContract()) { result ->
39+
viewModel.onLoginResult(result.data?.extras)
40+
}
41+
private val cardReaderPageLauncher = registerForActivityResult(SumUpCardReaderPageContract()) { result ->
42+
viewModel.onCardReaderPageResult(result.data?.extras)
43+
}
44+
private val checkoutLauncher = registerForActivityResult(SumUpCheckoutContract()) { result ->
45+
viewModel.onPaymentResult(result.data?.extras)
46+
}
47+
3648
override fun onCreate(savedInstanceState: Bundle?) {
3749
enableEdgeToEdge()
3850
super.onCreate(savedInstanceState)
@@ -46,17 +58,6 @@ class MainActivity : ComponentActivity() {
4658
}
4759
}
4860

49-
@Deprecated("Required by SumUp SDK which uses startActivityForResult")
50-
@Suppress("DEPRECATION")
51-
override fun onActivityResult(requestCode: Int, resultCode: Int, data: android.content.Intent?) {
52-
super.onActivityResult(requestCode, resultCode, data)
53-
when (requestCode) {
54-
REQUEST_CODE_LOGIN -> viewModel.onLoginResult(data?.extras)
55-
REQUEST_CODE_CARD_READER_PAGE -> viewModel.onCardReaderPageResult(data?.extras)
56-
REQUEST_CODE_PAYMENT -> viewModel.onPaymentResult(data?.extras)
57-
}
58-
}
59-
6061
override fun onResume() {
6162
super.onResume()
6263

@@ -65,20 +66,11 @@ class MainActivity : ComponentActivity() {
6566

6667
private fun handleSdkAction(actionRequest: SdkActionRequest) {
6768
when (actionRequest) {
68-
is SdkActionRequest.OpenLogin ->
69-
SumUpAPI.openLoginActivity(this, actionRequest.login, REQUEST_CODE_LOGIN)
70-
is SdkActionRequest.StartCheckout ->
71-
SumUpAPI.checkout(this, actionRequest.payment, REQUEST_CODE_PAYMENT)
72-
SdkActionRequest.OpenCardReaderPage ->
73-
SumUpAPI.openCardReaderPage(this, REQUEST_CODE_CARD_READER_PAGE)
69+
is SdkActionRequest.OpenLogin -> loginLauncher.launch(actionRequest.login)
70+
is SdkActionRequest.StartCheckout -> checkoutLauncher.launch(actionRequest.payment)
71+
SdkActionRequest.OpenCardReaderPage -> cardReaderPageLauncher.launch(null)
7472
}
7573
}
76-
77-
private companion object {
78-
private const val REQUEST_CODE_LOGIN = 101
79-
private const val REQUEST_CODE_PAYMENT = 102
80-
private const val REQUEST_CODE_CARD_READER_PAGE = 103
81-
}
8274
}
8375

8476
@Composable

app/src/main/java/com/sumup/app/presentation/MainViewModel.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import com.sumup.app.domain.usecase.ParseSdkStatusUseCase
1212
import com.sumup.app.presentation.model.SdkActionRequest
1313
import com.sumup.app.presentation.model.UiEvent
1414
import com.sumup.app.presentation.model.UiState
15-
import com.sumup.app.util.CoroutinesDispatcherProvider
1615
import com.sumup.app.util.handleFailure
1716
import com.sumup.app.util.safelySuspend
1817
import com.sumup.merchant.reader.api.SumUpAPI
@@ -35,7 +34,6 @@ internal class MainViewModel(
3534
private val parseSdkStatusUseCase: ParseSdkStatusUseCase,
3635
private val parsePaymentResultUseCase: ParsePaymentResultUseCase,
3736
private val readerSdkRepository: ReaderSdkRepository,
38-
private val dispatcherProvider: CoroutinesDispatcherProvider,
3937
) : ViewModel() {
4038

4139
private val _uiState = MutableStateFlow(UiState())

build.gradle.kts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ buildscript {
66
google()
77
}
88
dependencies {
9-
classpath("com.android.tools.build:gradle:8.9.1")
10-
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20")
11-
classpath("org.jetbrains.kotlin:compose-compiler-gradle-plugin:2.1.20")
9+
classpath("com.android.tools.build:gradle:9.2.1")
10+
classpath("org.jetbrains.kotlin:compose-compiler-gradle-plugin:2.4.0")
1211
}
1312
}
1413

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Wed Sep 02 09:19:11 CEST 2020
1+
#Mon Jun 15 14:36:11 CEST 2026
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
4+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip
45
zipStoreBase=GRADLE_USER_HOME
56
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip

0 commit comments

Comments
 (0)