From 641dc8006d18eff6d2c39b9e93177e4655de4564 Mon Sep 17 00:00:00 2001 From: thomasmonext <48686647+thomasmonext@users.noreply.github.com> Date: Tue, 7 Oct 2025 18:17:21 +0200 Subject: [PATCH] =?UTF-8?q?feature/PAYLSQUAD3-3439=20-=20[SDK=5FANDROID][3?= =?UTF-8?q?DS]:=202=20-=20Traitement=20de=20la=20r=C3=A9ponse=20challenge?= =?UTF-8?q?=203DS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Renommage SdkContextData.kt - Ajout model SdkChallengeData.kt - Ajout page de Challenge - Custom UI - Fix issues (Import, TODO, commented out code, complexity...) - fix proguard-rules - TU --- .github/workflows/github-action.yml | 269 +- app/build.gradle.kts | 9 +- gradle.properties | 5 +- gradle/libs.versions.toml | 21 +- monext/build.gradle.kts | 72 +- monext/consumer-rules.pro | 3351 +++++++++++++++- monext/proguard-rules.pro | 3538 +---------------- .../kotlin/com/monext/sdk/PaymentSheetTest.kt | 6 +- .../kotlin/com/monext/sdk/SdkTestHelper.kt | 50 + .../view/PaymentSdkChallengeScreenTest.kt | 94 + .../sdk/presentation/PaymentContainerTest.kt | 13 +- monext/src/debug/assets/logback-android.xml | 15 + .../main/kotlin/com/monext/sdk/Appearance.kt | 4 +- .../com/monext/sdk/MnxtSDKConfiguration.kt | 9 +- .../kotlin/com/monext/sdk/PaymentSheet.kt | 17 +- .../com/monext/sdk/internal/api/PaymentAPI.kt | 16 + .../sdk/internal/api/ProxyHttpClient.kt | 2 +- .../api/configuration/InternalSDKContext.kt | 2 +- .../model/response/SessionStateResponse.kt | 7 +- .../internal/data/SessionStateRepository.kt | 53 +- .../data/sessionstate/PaymentMethodsList.kt | 6 +- .../internal/exception/ThreeDsException.kt | 3 - .../internal/presentation/PaymentContainer.kt | 26 +- .../presentation/SessionStateViewModel.kt | 34 +- .../presentation/common/FormTextField.kt | 201 +- .../common/PaymentMethodsScreen.kt | 4 + .../sdk/internal/preview/PaymentAPIPreview.kt | 24 +- .../internal/preview/SessionStateSample.kt | 18 - .../threeds/CustomChallengeStatusReceiver.kt | 54 + .../sdk/internal/threeds/ThreeDSBusiness.kt | 32 + .../sdk/internal/threeds/ThreeDSManager.kt | 294 +- .../threeds/model/AuthenticationResponse.kt | 15 + .../threeds/model/ChallengeUseCaseCallback.kt | 11 + .../threeds/model/PaymentSdkChallenge.kt | 9 + .../internal/threeds/model/SDKContextData.kt | 16 - .../threeds/model/SdkChallengeData.kt | 48 + .../internal/threeds/model/SdkContextData.kt | 16 + .../threeds/view/PaymentSdkChallengeScreen.kt | 53 + .../kotlin/com/monext/sdk/SdkTestHelper.kt | 207 + .../sdk/internal/api/PaymentAPIImplTest.kt | 83 +- .../data/SessionStateRepositoryTest.kt | 230 ++ .../presentation/SessionStateViewModelTest.kt | 98 + .../preview/PaymentAPIPreviewSuccessTest.kt | 59 + .../CustomChallengeStatusReceiverTest.kt | 95 + .../internal/threeds/ThreeDSBusinessTest.kt | 26 + .../internal/threeds/ThreeDSManagerTest.kt | 245 ++ .../threeds/model/PaymentSdkChallengeTest.kt | 19 + .../threeds/model/SdkChallengeDataTest.kt | 33 + settings.gradle.kts | 1 + 49 files changed, 5718 insertions(+), 3795 deletions(-) create mode 100644 monext/src/androidTest/kotlin/com/monext/sdk/SdkTestHelper.kt create mode 100644 monext/src/androidTest/kotlin/com/monext/sdk/internal/threeds/view/PaymentSdkChallengeScreenTest.kt create mode 100644 monext/src/debug/assets/logback-android.xml create mode 100644 monext/src/main/kotlin/com/monext/sdk/internal/threeds/CustomChallengeStatusReceiver.kt create mode 100644 monext/src/main/kotlin/com/monext/sdk/internal/threeds/ThreeDSBusiness.kt create mode 100644 monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/AuthenticationResponse.kt create mode 100644 monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/ChallengeUseCaseCallback.kt create mode 100644 monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/PaymentSdkChallenge.kt delete mode 100644 monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SDKContextData.kt create mode 100644 monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SdkChallengeData.kt create mode 100644 monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SdkContextData.kt create mode 100644 monext/src/main/kotlin/com/monext/sdk/internal/threeds/view/PaymentSdkChallengeScreen.kt create mode 100644 monext/src/test/kotlin/com/monext/sdk/SdkTestHelper.kt create mode 100644 monext/src/test/kotlin/com/monext/sdk/internal/data/SessionStateRepositoryTest.kt create mode 100644 monext/src/test/kotlin/com/monext/sdk/internal/presentation/SessionStateViewModelTest.kt create mode 100644 monext/src/test/kotlin/com/monext/sdk/internal/preview/PaymentAPIPreviewSuccessTest.kt create mode 100644 monext/src/test/kotlin/com/monext/sdk/internal/threeds/CustomChallengeStatusReceiverTest.kt create mode 100644 monext/src/test/kotlin/com/monext/sdk/internal/threeds/ThreeDSBusinessTest.kt create mode 100644 monext/src/test/kotlin/com/monext/sdk/internal/threeds/ThreeDSManagerTest.kt create mode 100644 monext/src/test/kotlin/com/monext/sdk/internal/threeds/model/PaymentSdkChallengeTest.kt create mode 100644 monext/src/test/kotlin/com/monext/sdk/internal/threeds/model/SdkChallengeDataTest.kt diff --git a/.github/workflows/github-action.yml b/.github/workflows/github-action.yml index 18b3e84..e2edb06 100644 --- a/.github/workflows/github-action.yml +++ b/.github/workflows/github-action.yml @@ -6,7 +6,6 @@ on: push: branches: [ main, develop ] # Se déclenche aussi lors de la création d'un tag commençant par 'v' (ex: v1.0.0) - # C'est ce qui déclenchera la publication de votre SDK tags: - 'v*' # Se déclenche lors de l'ouverture ou mise à jour d'une Pull Request @@ -15,7 +14,7 @@ on: # VARIABLES GLOBALES - Utilisées dans tous les jobs env: - ANDROID_COMPILE_SDK: "34" # Android 14 + ANDROID_COMPILE_SDK: "34" ANDROID_BUILD_TOOLS: "34.0.0" ANDROID_SDK_TOOLS: "11076708" # Version des outils de ligne de commande Android JDK_DISTRIBUTION: 'temurin' # Distribution OpenJDK @@ -62,14 +61,7 @@ jobs: # ============================================ # Tests unitaires ET génération du rapport JaCoCo - name: Run unit tests with coverage - run: | - ./gradlew testDebugUnitTest --stacktrace - ./gradlew jacocoTestReport --stacktrace - echo "Coverage report generated at: monext/build/reports/jacoco/jacocoTestReport/" - #env: - # Injecte la clé API depuis les secrets GitHub - # Cette variable sera accessible dans BuildConfig - # THREEDS_API_ACCESS_KEY: ${{ secrets.THREEDS_API_ACCESS_KEY }} + run: ./gradlew testDebugUnitTest --stacktrace # Sauvegarde les rapports de tests même si les tests échouent - name: Upload unit test results @@ -80,6 +72,7 @@ jobs: path: | **/build/reports/tests/ **/build/reports/jacoco/ + **/build/outputs/unit_test_code_coverage/ # ============================================ # TESTS Android @@ -90,6 +83,7 @@ jobs: sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm + # Tests d'instrumentation sur émulateur - name: Start emulator and run instrumented tests uses: reactivecircus/android-emulator-runner@v2 with: @@ -102,9 +96,7 @@ jobs: emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim disable-animations: true # Désactive les animations pour accélérer les tests # Commande à exécuter une fois l'émulateur démarré - script: ./gradlew connectedAndroidTest --stacktrace - #env: - #THREEDS_API_ACCESS_KEY: ${{ secrets.THREEDS_API_ACCESS_KEY }} + script: ./gradlew createDebugCoverageReport --stacktrace # Sauvegarde les résultats des tests instrumentés - name: Upload instrumented test results @@ -112,7 +104,23 @@ jobs: if: always() with: name: instrumented-test-results - path: '**/build/reports/androidTests/' + path: | + **/build/reports/androidTests/ + **/build/reports/coverage/ + **/build/outputs/code_coverage/ + + # Genere un rapport qui combine les TU et les AndroidTest + - name: Generate unified coverage report + run: | + ./gradlew jacocoTestReport --stacktrace + echo "Coverage report generated at: monext/build/reports/jacoco/jacocoTestReport/" + + - name: Upload JaCoCo report + uses: actions/upload-artifact@v4 + if: always() + with: + name: jacoco-report + path: '**/build/reports/jacoco/' # ============================================ # ANALYSE SONARCLOUD @@ -148,13 +156,19 @@ jobs: - name: Download test artifacts uses: actions/download-artifact@v4 with: - name: unit-test-results + path: build-artifacts + + - name: Restore coverage files + run: | + cp -r build-artifacts/jacoco-report/* ./ 2>/dev/null || true + cp -r build-artifacts/unit-test-results/* ./ 2>/dev/null || true + cp -r build-artifacts/instrumented-test-results/* ./ 2>/dev/null || true - # Vérifie que le fichier de coverage existe - name: Check coverage report run: | echo "Checking for coverage files..." find . -name "*.exec" -type f + find . -name "*.ec" -type f find . -name "jacocoTestReport.xml" -type f # Build minimal puis Sonar (pas de re-test) @@ -165,3 +179,226 @@ jobs: run: | ./gradlew assemble --stacktrace ./gradlew sonar --info -x test -x testDebugUnitTest + + + + +# +# # ============================================ +# # BUILD ET PUBLICATION DU SDK +# # ============================================ +# build-and-publish: +# name: Build and Publish SDK +# runs-on: ubuntu-latest +# needs: [test, sonarcloud] +# # branches: [ main, develop ] # TODO : A tester +# if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags/v')) +# +# steps: +# - name: Checkout code +# uses: actions/checkout@v4 +# +# - name: Set up JDK +# uses: actions/setup-java@v4 +# with: +# distribution: ${{ env.JDK_DISTRIBUTION }} +# java-version: ${{ env.JDK_VERSION }} +# cache: 'gradle' +# +# - name: Setup Android SDK +# uses: android-actions/setup-android@v3 +# with: +# cmdline-tools-version: ${{ env.ANDROID_SDK_TOOLS }} +# +# - name: Retrieve Version +# run: echo "VERSION_NAME=$(${{github.workspace}}/gradlew -q :monext:printVersion)" >> $GITHUB_ENV +## run: | +## echo "::set-output name=VERSION_NAME::$(${{github.workspace}}/gradlew -q :monext:printVersion)" +# +# - name: Decode and save keystore +# if: startsWith(github.ref, 'refs/tags/v') +# env: +# KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} +# run: | +# echo "$KEYSTORE_BASE64" | base64 -d > ${{ github.workspace }}/keystore.jks +# +# - name: Extract version from tag +# if: startsWith(github.ref, 'refs/tags/v') +# id: get_version +# run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT +# +# - name: Build Release AAR +# run: ./gradlew :monext:assembleRelease +# env: +# THREEDS_API_ACCESS_KEY: ${{ secrets.THREEDS_API_ACCESS_KEY }} +# KEYSTORE_PATH: ${{ github.workspace }}/keystore.jks +# KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} +# KEY_ALIAS: ${{ secrets.KEY_ALIAS }} +# KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} +# SDK_VERSION: ${{ env.VERSION_NAME }} +## SDK_VERSION: ${{ steps.get_version.outputs.VERSION }} +# +# - name: Generate documentation +# run: ./gradlew :monext:dokkaHtml +# +# - name: Upload AAR artifact +# uses: actions/upload-artifact@v4 +# with: +# name: sdk-aar +# path: monext/build/outputs/aar/*.aar +# +# # Publication sur Maven Central +# - name: Publish to Maven Central +# if: startsWith(github.ref, 'refs/tags/v') +# run: ./gradlew :monext:publishReleasePublicationToMavenCentralRepository +# env: +# MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} +# MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} +# SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} +# SIGNING_KEY: ${{ secrets.SIGNING_KEY }} +# SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} +# THREEDS_API_ACCESS_KEY: ${{ secrets.THREEDS_API_ACCESS_KEY }} +# +# # Publication sur GitHub Packages +# - name: Publish to GitHub Packages +# if: startsWith(github.ref, 'refs/tags/v') +# run: ./gradlew :monext:publishReleasePublicationToGitHubPackagesRepository +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# THREEDS_API_ACCESS_KEY: ${{ secrets.THREEDS_API_ACCESS_KEY }} +# +# - name: Create GitHub Release +# if: startsWith(github.ref, 'refs/tags/v') +# uses: softprops/action-gh-release@v1 +# with: +# files: | +# monext/build/outputs/aar/*.aar +# CHANGELOG.md +# generate_release_notes: true +# draft: true +# prerelease: false +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # ============================================ + # NOTIFICATIONS Teams + # ============================================ + notify: + name: Teams Notification + runs-on: ubuntu-latest + #needs: [build-and-publish] + if: + contains(' + refs/heads/main + refs/heads/master + refs/heads/develop + refs/heads/release + ', github.ref) + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Retrieve Version + id: get_version + run: | + VERSION_NAME=$(./gradlew -q :monext:printVersion | tail -n 1 | tr -d '\n\r') + VERSION_CODE=$(./gradlew -q :monext:printVersionCode | tail -n 1 | tr -d '\n\r') + echo "VERSION_NAME=${VERSION_NAME}" >> $GITHUB_ENV + echo "VERSION_CODE=${VERSION_CODE}" >> $GITHUB_ENV + echo "Version retrieved: ${VERSION_NAME} (${VERSION_CODE})" + + - name: Send Teams Notification + if: always() + run: | + ICON_COLOR="${{ job.status == 'success' && 'Good' || 'attention' }}" + ICON="${{ job.status == 'success' && 'CheckmarkStarburst' || 'DismissCircle' }}" + STATUS_TEXT="${{ job.status }}" + + curl -X POST "${{ secrets.TEAMS_WEBHOOK_URL_DEVTEAM }}" \ + -H "Content-Type: application/json" \ + -d @- << EOF + { + "type": "message", + "attachments": [ + { + "contentType": "application/vnd.microsoft.card.adaptive", + "contentUrl": null, + "content": { + "type": "AdaptiveCard", + "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.4", + "body": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "width": "auto", + "height": "stretch", + "items": [ + { + "type": "Icon", + "name": "${ICON}", + "style": "Filled", + "color": "${ICON_COLOR}" + } + ], + "spacing": "None" + }, + { + "type": "Column", + "width": "stretch", + "items": [ + { + "type": "TextBlock", + "text": "Publication **SDK Android** - ${STATUS_TEXT}", + "wrap": true, + "size": "Large", + "weight": "Bolder" + } + ], + "spacing": "Small" + } + ], + "spacing": "None" + }, + { + "type": "TextBlock", + "text": "_version ${{env.VERSION_NAME}} (build ${{env.VERSION_CODE}})_", + "wrap": true, + "isSubtle": true, + "spacing": "Small" + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Repository:", + "value": "${{ github.repository }}" + }, + { + "title": "Branch/Tag:", + "value": "${{ github.HEAD_REF }}" + }, + { + "title": "Auteur:", + "value": "${{ github.actor }}" + } + ], + "separator": true + } + ], + "actions": [ + { + "type": "Action.OpenUrl", + "title": "Voir le build", + "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + } + ] + } + } + ] + } + EOF \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3be3608..efe0895 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -32,8 +32,8 @@ android { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } - kotlinOptions { - jvmTarget = "21" + kotlin { + jvmToolchain(21) } buildFeatures { compose = true @@ -47,10 +47,13 @@ android { dependencies { implementation(project(":monext")) + // # Faire un ./gradlew :monext:publishToMavenLocal pour publier en local et tester le aar généré + //implementation("com.monext:payment-sdk-android:1.0.0") + implementation(libs.androidx.activity.compose) implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.viewmodel) implementation(libs.androidx.lifecycle.runtime.ktx) - implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.ui.graphics) diff --git a/gradle.properties b/gradle.properties index 20e2a01..bd01548 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,7 @@ kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true + +# APP & SDK Version +version=1.0.0 \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 426331f..af53f38 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,14 @@ [versions] +activity = "1.11.0" activityCompose = "1.11.0" -agp = "8.11.1" +activityKtx = "1.11.0" +agp = "8.11.2" +androidCoreKtx = "1.17.0" +androidLifecycleRuntimeKtx = "2.9.4" +appcompat = "1.7.1" bouncycastle = "1.79" composeBom = "2025.09.00" composePayButton = "1.1.0" -coreKtx = "1.17.0" datastorePreferences = "1.1.7" dokka = "2.0.0" espressoCore = "3.5.0" @@ -16,7 +20,6 @@ kotlin = "2.2.20" kotlinxCoroutinesPlayServices = "1.10.2" kotlinSerialization = "2.2.20" kotlinxSerializationJson = "1.9.0" -lifecycleRuntimeKtx = "2.9.3" playServicesWallet = "19.4.0" slf4jApi = "2.0.17" sonarqube = "6.3.1.5724" @@ -24,17 +27,19 @@ uiTooling = "1.9.1" uiTestJunit4Android = "1.9.1" runtime = "1.0.0-alpha05" junitKtx = "1.3.0" -appcompat = "1.7.1" [libraries] +androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } -androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +androidx-activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "activityKtx" } +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidCoreKtx" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } -androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } -androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidLifecycleRuntimeKtx" } +androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidLifecycleRuntimeKtx" } +androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidLifecycleRuntimeKtx" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-ui = { group = "androidx.compose.ui", name = "ui" } androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } @@ -45,6 +50,8 @@ androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit bouncycastle-bcprov = { module = "org.bouncycastle:bcprov-jdk15to18", version.ref = "bouncycastle" } compose-pay-button = { module = "com.google.pay.button:compose-pay-button", version.ref = "composePayButton" } io-mockk = { group = "io.mockk", name = "mockk", version.ref = "io-mockk" } +io-mockk-android = { group = "io.mockk", name = "mockk-android", version.ref = "io-mockk" } +io-mockk-agent = { group = "io.mockk", name = "mockk-agent", version.ref = "io-mockk" } jetbrains-kotlinx-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "jetbrains-kotlinx-test" } junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junitJupiter" } kotlinx-coroutines-play-services = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services", version.ref = "kotlinxCoroutinesPlayServices" } diff --git a/monext/build.gradle.kts b/monext/build.gradle.kts index 03e9094..a37bea5 100644 --- a/monext/build.gradle.kts +++ b/monext/build.gradle.kts @@ -21,8 +21,12 @@ android { namespace = "com.monext.sdk" compileSdk = 36 + version = getVersionName() + defaultConfig { minSdk = 26 + val versionName = getVersionName() // Version courante + val versionCode = getVersionCode() // Code du build testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") @@ -31,8 +35,9 @@ android { val apiKey = getApiKey() buildConfigField("String", "THREEDS_API_ACCESS_KEY", "\"${apiKey}\"") - val sdkVersion = System.getenv("SDK_VERSION") ?: "1.0.0" - buildConfigField("String", "SDK_VERSION", "\"${sdkVersion}\"") + // Métadonnées de build + buildConfigField("String", "VERSION_NAME", "\"$versionName\"") + buildConfigField("long", "VERSION_CODE", "$versionCode") } buildTypes { @@ -100,7 +105,12 @@ android { // Options de packaging packaging { resources { - excludes += "/META-INF/{AL2.0,LGPL2.1}" + excludes += + setOf( + "/META-INF/{AL2.0,LGPL2.1}", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md" + ) // Important pour Netcetera SDK pickFirsts += "META-INF/DEPENDENCIES" } @@ -123,6 +133,14 @@ android { } animationsDisabled = true // Désactive les animations pour accélérer } + + libraryVariants.all { + outputs.all { + val outputImpl = this as com.android.build.gradle.internal.api.BaseVariantOutputImpl + val versionName = getVersionName() + outputImpl.outputFileName = "monext-sdk-${versionName}-${name}.aar" + } + } } // Fonction pour récupérer la clé API de manière sécurisée @@ -151,6 +169,23 @@ fun getApiKey(): String { return "DEVELOPMENT_KEY_REPLACE_IN_PRODUCTION" } +// Fonction pour déterminer la version du SDK +fun getVersionName(): String { + // Priorité : + // 1. Variable d'environnement (CI/CD) + // 2. Propriété gradle.properties ou -P + // 3. Valeur par défaut + return System.getenv("VERSION_NAME") + ?: project.findProperty("version") as? String + ?: "default" +} +// Fonction pour récupérer la version du build +fun getVersionCode(): Int { + // GitHub Actions run number ou timestamp pour local + return System.getenv("GITHUB_RUN_NUMBER")?.toIntOrNull() + ?: (System.currentTimeMillis() / 1000).toInt() +} + // Configuration pour la publication Maven publishing { // Configure comment publier sur Maven Central/GitHub @@ -158,7 +193,7 @@ publishing { create("release") { groupId = "com.monext" artifactId = "payment-sdk-android" - version = System.getenv("SDK_VERSION") ?: "1.0.0" + version = getVersionName() afterEvaluate { from(components["release"]) @@ -232,7 +267,7 @@ publishing { // Configuration de la signature GPG pour Maven Central signing { - isRequired = System.getenv("CI") == "true" && System.getenv("SDK_VERSION") != null + isRequired = System.getenv("CI") == "true" && getVersionName() != "default" useInMemoryPgpKeys( System.getenv("SIGNING_KEY_ID"), @@ -306,6 +341,14 @@ tasks { } } +tasks.register("printVersion") { + println(getVersionName()) +} + +tasks.register("printVersionCode") { + println(getVersionCode()) +} + // Configuration des tests avec coverage tasks.withType { useJUnitPlatform() @@ -320,11 +363,17 @@ jacoco { } tasks.register("jacocoTestReport") { + description = "Generate Jacoco coverage report for both unit and instrumentation tests" + group = "verification" + + // Dépend des tests unitaires ET d'instrumentation si disponibles + /*dependsOn(tasks.matching { + it.name in listOf("testDebugUnitTest", "createDebugCoverageReport") + })*/ dependsOn("testDebugUnitTest") reports { xml.required.set(true) - xml.required.set(true) // Pour SonarCloud html.required.set(true) csv.required.set(false) } @@ -350,8 +399,8 @@ tasks.register("jacocoTestReport") { executionData.setFrom( fileTree(layout.buildDirectory.get().asFile) { - include("outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec") - include("jacoco/testDebugUnitTest.exec") + include("**/*.exec") // Tests unitaires + include("**/*.ec") // Tests d'instrumentation } ) } @@ -359,7 +408,9 @@ tasks.register("jacocoTestReport") { dependencies { implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.activity) implementation(libs.androidx.activity.compose) + implementation(libs.androidx.activity.ktx) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.lifecycle.viewmodel.compose) @@ -368,7 +419,7 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.bouncycastle.bcprov) - implementation(libs.compose.pay.button) + api(libs.compose.pay.button) implementation(libs.kotlinx.coroutines.play.services) implementation(libs.kotlinx.serialization.json) implementation(libs.slf4j.api) @@ -392,4 +443,7 @@ dependencies { androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.ui.test.junit4.android) + androidTestImplementation(libs.io.mockk) + androidTestImplementation(libs.io.mockk.agent) + androidTestImplementation(libs.io.mockk.android) } \ No newline at end of file diff --git a/monext/consumer-rules.pro b/monext/consumer-rules.pro index 0fefd5e..1548daa 100644 --- a/monext/consumer-rules.pro +++ b/monext/consumer-rules.pro @@ -1,6 +1,3349 @@ +## ============================================ +## CONSUMER RULES (consumer-rules.pro) +## Ces règles seront automatiquement appliquées +## dans l'app qui utilise le SDK +## ============================================ +# API Publique - Fonctions Kotlin +-keep public class com.monext.sdk.PaymentBoxKt { + public ; +} +-keep public class com.monext.sdk.PaymentSheetKt { + public ; +} +-keep public class com.monext.sdk.MnxtSDKContextKt { + public ; +} + +# API Publique - Classes +-keep public class com.monext.sdk.Appearance { *; } +-keep public class com.monext.sdk.GooglePayConfiguration { *; } +-keep public class com.monext.sdk.MnxtEnvironment { *; } +-keep public class com.monext.sdk.MnxtEnvironment$* { *; } +-keep public class com.monext.sdk.MnxtSDKConfiguration { *; } +-keep public class com.monext.sdk.MnxtSDKContext { *; } +-keep public class com.monext.sdk.PaymentResult { *; } +-keep public class com.monext.sdk.PaymentResult$* { *; } + +# Enums +-keepclassmembers public enum com.monext.sdk.** { + **[] $VALUES; + public *; +} + +# Compose +-keep @androidx.compose.runtime.Composable class * { *; } + +# Google Pay Button +#-keep public class com.google.pay.button.** { *; } +-keep public class com.google.pay.button.** { *; } +-keep public enum com.google.pay.button.ButtonTheme { *; } +-keep public enum com.google.pay.button.ButtonType { *; } + + # ============================================ -# CONSUMER RULES (consumer-rules.pro) -# Ces règles seront automatiquement appliquées -# dans l'app qui utilise votre SDK +# NETCETERA 3DS SDK # ============================================ -#-keep class com.monext.sdk.** { *; } \ No newline at end of file + + + +-keeppackagenames com.netcetera.threeds.sdk.api.info,com.netcetera.threeds.sdk.api,com.netcetera.threeds.sdk.api.configparameters,com.netcetera.threeds.sdk.api.ui.logic,com.netcetera.threeds.sdk.infrastructure,com.netcetera.threeds.sdk.api.security,com.netcetera.threeds.sdk.api.transaction.challenge,com.netcetera.threeds.sdk.api.exceptions,org.bouncycastle.jce.provider,com.netcetera.threeds.sdk.api.transaction,com.netcetera.threeds.sdk.api.ui,com.netcetera.threeds.sdk.api.transaction.challenge.events +-adaptresourcefilecontents !jni/arm64-v8a/libae63.so,!jni/armeabi-v7a/libae63.so,!jni/x86/libae63.so,!jni/x86_64/libae63.so,!lib/arm64-v8a/libae63.so,!lib/armeabi-v7a/libae63.so,!lib/x86/libae63.so,!lib/x86_64/libae63.so,dummyfile +-dontwarn proguard.annotation.** + + + + +# Keep everyting in the Netcetera Android 3DS SDK package +-keep public class com.netcetera.threeds.sdk.** { + public protected ; public protected ; +} + +-keep,allowshrinking class com.netcetera.threeds.sdk.** { + ; ; +} + +# Keep everyting in Guardsquare Dexguard +-keep public class com.guardsquare.dexguard.** { + public protected ; public protected ; +} + +# Keep everything from bouncycastle +-keep class org.bouncycastle.** { + ; ; +} + +-keep,allowshrinking class org.bouncycastle.** { + ; ; +} + +# Keep the classes from slf4j +-keep class org.slf4j.** { + ; ; +} + +# Keep kotlin.KotlinVersion if present +-keep class kotlin.KotlinVersion { + ; ; +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ThreeDS2Service { + byte[][] getWarnings(int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.get { + byte[] ThreeDS2Service; int[] ThreeDS2ServiceInstance; int[] getWarnings; int[] get; int[] initialize; int ThreeDS2ServiceInitializationCallback; int[] cleanup; byte[][] getSDKInfo; int[] createTransaction; byte[] getSDKVersion; byte[] onError; int addParam; int getParamValue; int onCompleted; int ConfigParameters; int apiKey; int ConfigurationBuilder; (java.io.InputStream,int,byte[],byte[][]); + (java.io.InputStream,int,byte[],byte[][],int,int); + int read(); + int read(byte[]); + int read(byte[],int,int); + long skip(long); + int available(); + void close(); + boolean markSupported(); + void mark(int); + void reset(); + byte[][] ThreeDS2ServiceInstance(byte[][]); + int get(); + void get(byte[],int,byte[],int); + void initialize(); + void (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ThreeDS2ServiceInstance { + void getWarnings(byte[],byte,long); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ThreeDS2ServiceInitializationCallback { + int getWarnings; (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.createTransaction { + int getWarnings; int get; int ThreeDS2Service; (); + void ThreeDS2Service(int[]); + int getWarnings(int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.getSDKInfo { + int getWarnings; int ThreeDS2Service; int initialize; (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.cleanup { + int ThreeDS2ServiceInstance; (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.getSDKVersion { + int initialize; int getWarnings; char ThreeDS2ServiceInstance; char get; (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ConfigParameters { + int initialize; char ThreeDS2Service; (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.onCompleted { + int ThreeDS2Service; int getWarnings; (); + char[] ThreeDS2ServiceInstance(long,char[],int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.addParam { + int get; int ThreeDS2ServiceInstance; (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.onError { + int ThreeDS2Service; int getWarnings; (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.getParamValue { + int ThreeDS2ServiceInstance; char get; char ThreeDS2Service; int initialize; int getWarnings; int createTransaction; int getSDKVersion; (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ConfigurationBuilder { + int initialize; (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.removeParam { + int get(java.lang.Object); + int ThreeDS2ServiceInstance(int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.CertificateInfoCertificateType { + java.lang.Integer initialize;} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.CertificateInfoCertificateType { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.ThreeDS2ServiceInstance { + (); +} + +-keep class com.netcetera.threeds.sdk.api.ThreeDS2Service { + void initialize(android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,com.netcetera.threeds.sdk.api.ui.logic.UiCustomization); + void initialize(android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,java.util.Map); + void initialize(android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,java.util.Map,com.netcetera.threeds.sdk.api.ThreeDS2Service$InitializationCallback); + java.util.List getWarnings(); + java.lang.String getSDKVersion(); + com.netcetera.threeds.sdk.api.info.SDKInfo getSDKInfo(); + void cleanup(android.content.Context); + com.netcetera.threeds.sdk.api.transaction.Transaction createTransaction(java.lang.String,java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.api.ThreeDS2Service$InitializationCallback { + void onCompleted(); + void onError(java.lang.Throwable); +} + +-keep class com.netcetera.threeds.sdk.api.configparameters.ConfigParameters { + java.lang.String getParamValue(java.lang.String,java.lang.String); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.api.configparameters.builder.ConfigurationBuilder { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.api.configparameters.builder.SchemeConfiguration$Builder { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.api.exceptions.InvalidInputException + +-keep class com.netcetera.threeds.sdk.api.exceptions.SDKAlreadyInitializedException + +-keep class com.netcetera.threeds.sdk.api.exceptions.SDKNotInitializedException + +-keep class com.netcetera.threeds.sdk.api.exceptions.SDKRuntimeException + +-keep class com.netcetera.threeds.sdk.api.info.CertificateInfo + +-keep class com.netcetera.threeds.sdk.api.info.CertificateInfo$CertificateType { + com.netcetera.threeds.sdk.api.info.CertificateInfo$CertificateType CERTIFICATE; com.netcetera.threeds.sdk.api.info.CertificateInfo$CertificateType PUBLIC_KEY;} + +-keep class com.netcetera.threeds.sdk.api.info.SDKInfo + +-keep class com.netcetera.threeds.sdk.api.security.Severity { + com.netcetera.threeds.sdk.api.security.Severity MEDIUM; com.netcetera.threeds.sdk.api.security.Severity HIGH;} + +-keep class com.netcetera.threeds.sdk.api.security.Warning { + (java.lang.String,java.lang.String,com.netcetera.threeds.sdk.api.security.Severity); +} + +-keep class com.netcetera.threeds.sdk.api.transaction.AuthenticationRequestParameters { + (java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.api.transaction.Transaction { + com.netcetera.threeds.sdk.api.transaction.AuthenticationRequestParameters getAuthenticationRequestParameters(); + void doChallenge(android.app.Activity,com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeParameters,com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver,int); + void useBridgingExtension(com.netcetera.threeds.sdk.api.transaction.Transaction$BridgingMessageExtensionVersion); + com.netcetera.threeds.sdk.api.ui.ProgressView getProgressView(android.app.Activity); + void close(); +} + +-keep class com.netcetera.threeds.sdk.api.transaction.Transaction$BridgingMessageExtensionVersion + +-keep class com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeParameters { + java.lang.String get3DSServerTransactionID(); + java.lang.String getAcsTransactionID(); + java.lang.String getAcsRefNumber(); + java.lang.String getAcsSignedContent(); +} + +-keep class com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver { + void completed(com.netcetera.threeds.sdk.api.transaction.challenge.events.CompletionEvent); + void cancelled(); + void timedout(); + void protocolError(com.netcetera.threeds.sdk.api.transaction.challenge.events.ProtocolErrorEvent); + void runtimeError(com.netcetera.threeds.sdk.api.transaction.challenge.events.RuntimeErrorEvent); +} + +-keep class com.netcetera.threeds.sdk.api.transaction.challenge.ErrorMessage { + java.lang.String getErrorCode(); + java.lang.String getErrorDescription(); + java.lang.String getErrorDetails(); + java.lang.String getErrorComponent(); +} + +-keep class com.netcetera.threeds.sdk.api.transaction.challenge.events.CompletionEvent { + java.lang.String getTransactionStatus(); +} + +-keep class com.netcetera.threeds.sdk.api.transaction.challenge.events.ProtocolErrorEvent { + com.netcetera.threeds.sdk.api.transaction.challenge.ErrorMessage getErrorMessage(); +} + +-keep class com.netcetera.threeds.sdk.api.transaction.challenge.events.RuntimeErrorEvent { + java.lang.String getErrorCode(); + java.lang.String getErrorMessage(); +} + +-keep class com.netcetera.threeds.sdk.api.ui.ProgressView + +-keep class com.netcetera.threeds.sdk.api.ui.logic.UiCustomization + +-keep class com.netcetera.threeds.sdk.api.ui.logic.UiCustomization$UiCustomizationType + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.api.utils.DsRidValues { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getCertPrefix { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.values { + (com.netcetera.threeds.sdk.infrastructure.values$ThreeDS2ServiceInstance); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.values$ThreeDS2ServiceInstance { + com.netcetera.threeds.sdk.infrastructure.values$ThreeDS2ServiceInstance ThreeDS2ServiceInstance(android.content.Context); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.close { + void initialize(com.netcetera.threeds.sdk.infrastructure.setAcsTransactionID); + void ThreeDS2Service(java.lang.Class); + java.lang.Object get(java.lang.Class); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setAcsTransactionID + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setAcsSignedContent { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.completed { + java.security.PublicKey getWarnings(java.lang.String); + com.netcetera.threeds.sdk.api.info.CertificateInfo$CertificateType ThreeDS2ServiceInstance(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.getErrorComponent { + (com.netcetera.threeds.sdk.infrastructure.getErrorMessage,java.util.List,com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.getTransactionStatus { + java.lang.String ThreeDS2Service(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.getMessageVersionNumber { + com.netcetera.threeds.sdk.infrastructure.getTransactionStatus ThreeDS2Service(java.lang.String,java.lang.String,java.lang.String,com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.showProgress { + java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.getErrorComponent); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.getErrorMessage + +-keep class com.netcetera.threeds.sdk.infrastructure.ProgressView { + void get(com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.util.Locale); + void getWarnings(com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings,com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service,java.lang.String); + com.netcetera.threeds.sdk.infrastructure.getErrorMessage get(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ProtocolErrorEvent { + void ThreeDS2ServiceInitializationCallback(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ProtocolErrorEvent$ThreeDS2Service { + void initialize(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hideProgress { + void initialize(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCornerRadius { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setDarkTextColor { + java.lang.Object[] initialize(int,int); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setDarkTextColor { + void init$0(); + void init$1(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setScrollContainer { + java.lang.Object[] getWarnings(android.content.Context,int,int); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScrollContainer { + void init$0(); + void init$1(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setStateListAnimator { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setStateListAnimator { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLayoutParams { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLayoutParams { + void initialize(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setScrollBarSize { + com.netcetera.threeds.sdk.infrastructure.setScrollbarFadingEnabled cleanup(); + java.lang.Object ThreeDS2Service(java.lang.Object[],int,int,int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setScrollbarFadingEnabled { + com.netcetera.threeds.sdk.infrastructure.setScrollbarFadingEnabled$ThreeDS2ServiceInstance ThreeDS2Service(); + java.lang.Object get(java.lang.Object[],int,int,int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setScrollbarFadingEnabled$ThreeDS2ServiceInstance { + java.lang.String ThreeDS2ServiceInstance(); + java.lang.String getWarnings(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setLayerPaint { + java.lang.Object get(java.lang.Object[],int,int,int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setLayerType { + java.lang.Object getWarnings(java.lang.Object[],int,int,int); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLayerType$get { + void getWarnings(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setRenderEffect { + java.lang.Object ThreeDS2ServiceInstance(java.lang.Object[],int,int,int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setDrawingCacheEnabled { + java.lang.Object getWarnings(java.lang.Object[],int,int,int); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setBackgroundDrawable { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setForegroundTintBlendMode { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setForegroundGravity { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setForegroundTintList { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setForegroundTintMode { + void initialize(long,long); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setPadding { + com.netcetera.threeds.sdk.infrastructure.setScrollBarSize ThreeDS2ServiceInstance(java.lang.String); + java.util.List initialize(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setActivated { + com.netcetera.threeds.sdk.infrastructure.setPadding ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.api.configparameters.ConfigParameters); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setAnimation { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMinimumHeight { + void initialize(long,long); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setOverScrollMode { + com.netcetera.threeds.sdk.infrastructure.completed initialize(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setTextAlignment { + com.netcetera.threeds.sdk.infrastructure.setTextAlignment ThreeDS2ServiceInitializationCallback; com.netcetera.threeds.sdk.infrastructure.setTextAlignment cleanup; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getParamValue; com.netcetera.threeds.sdk.infrastructure.setTextAlignment onCompleted; com.netcetera.threeds.sdk.infrastructure.setTextAlignment ConfigParameters; com.netcetera.threeds.sdk.infrastructure.setTextAlignment addParam; com.netcetera.threeds.sdk.infrastructure.setTextAlignment build; com.netcetera.threeds.sdk.infrastructure.setTextAlignment mastercardSchemeConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment amexConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SchemeConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment dinersSchemeConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment eftposConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment cbConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemeLogoDark; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemeId; com.netcetera.threeds.sdk.infrastructure.setTextAlignment newSchemeConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemeName; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemeEncryptionPublicKeyId; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SchemeConfigurationBuilder; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemePublicRootKeys; com.netcetera.threeds.sdk.infrastructure.setTextAlignment logo; com.netcetera.threeds.sdk.infrastructure.setTextAlignment encryptionPublicKey; com.netcetera.threeds.sdk.infrastructure.setTextAlignment rootPublicKey; com.netcetera.threeds.sdk.infrastructure.setTextAlignment logoDark; com.netcetera.threeds.sdk.infrastructure.setTextAlignment encryptionPublicKeyFromAssetCertificate; com.netcetera.threeds.sdk.infrastructure.setTextAlignment rootPublicKeyFromAssetCertificate; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SDKNotInitializedException; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SDKAlreadyInitializedException; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SDKRuntimeException; com.netcetera.threeds.sdk.infrastructure.setTextAlignment toString; com.netcetera.threeds.sdk.infrastructure.setTextAlignment CertificateInfo; com.netcetera.threeds.sdk.infrastructure.setTextAlignment values; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getCertPrefix; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SDKInfo; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getEncryptionCertificate; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getEncryptionCertificateKid; com.netcetera.threeds.sdk.infrastructure.setTextAlignment Warning; com.netcetera.threeds.sdk.infrastructure.setTextAlignment AuthenticationRequestParameters; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getDeviceData; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getMessageVersion; com.netcetera.threeds.sdk.infrastructure.setTextAlignment ChallengeParameters; com.netcetera.threeds.sdk.infrastructure.setTextAlignment TransactionBridgingMessageExtensionVersion; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getValue; com.netcetera.threeds.sdk.infrastructure.setTextAlignment setAcsTransactionID; com.netcetera.threeds.sdk.infrastructure.setTextAlignment setAcsSignedContent; com.netcetera.threeds.sdk.infrastructure.setTextAlignment setAcsRefNumber; com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener get(java.lang.Object[]); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTextAlignment { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTextDirection { + void get(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled { + void getWarnings(com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$ThreeDS2ServiceInstance); + void getWarnings(com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$ThreeDS2ServiceInstance,java.lang.Runnable); + java.lang.Object ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$initialize); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$initialize + +-keep class com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$ThreeDS2ServiceInstance + +-keep class com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener { + com.netcetera.threeds.sdk.infrastructure.setTextAlignment ThreeDS2ServiceInstance(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setScrollCaptureHint { + int initialize; (com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver); + void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.api.transaction.challenge.events.CompletionEvent); + void ThreeDS2Service(); + void getWarnings(); + void getWarnings(com.netcetera.threeds.sdk.api.transaction.challenge.events.ProtocolErrorEvent); + void initialize(com.netcetera.threeds.sdk.api.transaction.challenge.events.RuntimeErrorEvent); + void (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setClipChildren { + com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled get(com.netcetera.threeds.sdk.infrastructure.setBreakStrategy); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setClipChildren { + void get(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMotionEventSplittingEnabled { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMotionEventSplittingEnabled { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTransitionGroup { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setClipToPadding { + java.lang.Object[] getWarnings(android.content.Context,int,int,int); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setClipToPadding { + void init$0(); + void init$1(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setLayoutAnimation { + void get(java.util.Date); + com.netcetera.threeds.sdk.api.info.SDKInfo getWarnings(java.util.List); + void initialize(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setOnHierarchyChangeListener { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLayoutTransition { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setLayoutMode { + java.util.Locale getWarnings(java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setPersistentDrawingCache { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setPersistentDrawingCache { + void get(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setLayoutAnimationListener { + void initialize(com.netcetera.threeds.sdk.infrastructure.setLines,com.netcetera.threeds.sdk.infrastructure.setAddStatesFromChildren); + void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setAllCaps,com.netcetera.threeds.sdk.infrastructure.setHorizontalScrollbarOverlay); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setAddStatesFromChildren { + void getWarnings(com.netcetera.threeds.sdk.infrastructure.setFilters); + void get(com.netcetera.threeds.sdk.infrastructure.setExtractedText); + void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setAllCaps); + void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); + void getWarnings(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setHorizontalScrollbarOverlay { + void getWarnings(); + void initialize(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setHttpAuthUsernamePassword { + java.lang.String get(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setVerticalScrollbarOverlay { + com.netcetera.threeds.sdk.infrastructure.setFindListener initialize(); + com.netcetera.threeds.sdk.infrastructure.setVerticalScrollbarOverlay ThreeDS2Service(); + com.netcetera.threeds.sdk.infrastructure.setNetworkAvailable getWarnings(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setNetworkAvailable + +-keep class com.netcetera.threeds.sdk.infrastructure.setFindListener { + com.netcetera.threeds.sdk.infrastructure.setHttpAuthUsernamePassword ThreeDS2ServiceInstance(); + boolean initialize(); + int ThreeDS2Service(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setWebViewClient { + com.netcetera.threeds.sdk.infrastructure.setVerticalScrollbarOverlay ThreeDS2Service(java.lang.String,java.lang.String,java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setVerticalScrollbarOverlay getWarnings(java.lang.String,java.lang.String,java.lang.String,java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setSafeBrowsingWhitelist { + com.netcetera.threeds.sdk.infrastructure.setWebViewClient ThreeDS2ServiceInstance(); + com.netcetera.threeds.sdk.infrastructure.setWebViewClient get(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setPictureListener { + (javax.net.ssl.SSLSocketFactory,java.lang.String); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setPictureListener { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setWebContentsDebuggingEnabled { + java.lang.Object initialize(java.lang.Object[],int,int,int); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setDataDirectorySuffix { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setItemChecked { + java.lang.Integer ThreeDS2Service; java.lang.Integer getWarnings; java.lang.Integer get; android.util.Range initialize;} + +-keep class com.netcetera.threeds.sdk.infrastructure.setAdapter { + (); + boolean getWarnings(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); + java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.setFindListener); + boolean initialize(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setFastScrollStyle { + com.netcetera.threeds.sdk.infrastructure.setLayoutAnimationListener ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setLayoutAnimationListener); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setFastScrollStyle { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMultiChoiceModeListener { + java.lang.Object[] get$22d121da(int,int,java.lang.Object,int); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMultiChoiceModeListener { + void init$0(); + void init$1(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSelector { + void initialize(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setFriction { + com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings get(); + com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings ThreeDS2ServiceInstance(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service ThreeDS2ServiceInstance(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service { + void getWarnings(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings { + com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings ThreeDS2ServiceInstance; com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings ThreeDS2Service; java.lang.String ThreeDS2ServiceInstance(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings { + void getWarnings(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setRemoteViewsAdapter { + java.lang.String get(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setEdgeEffectColor { + java.lang.String initialize(); + java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings); + java.lang.String getWarnings(); + java.lang.String ThreeDS2ServiceInstance(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setVelocityScale { + (); + java.lang.String ThreeDS2ServiceInstance(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setTopEdgeEffectColor { + com.netcetera.threeds.sdk.infrastructure.setTopEdgeEffectColor ThreeDS2ServiceInstance;} + +-keep class com.netcetera.threeds.sdk.infrastructure.setOnGroupCollapseListener { + (boolean); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setScaleType { + (java.lang.Object); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setBaselineY10307$5 { + int[] get;} + +-keep class com.netcetera.threeds.sdk.infrastructure.setImageMatrix { + com.netcetera.threeds.sdk.infrastructure.setImageMatrix ThreeDS2Service(java.lang.String); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setImageMatrix { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setBaselineAlignBottom { + java.lang.String ThreeDS2ServiceInstance(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCropToPadding { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setDividerPadding { + com.netcetera.threeds.sdk.infrastructure.setDividerPadding ThreeDS2ServiceInstance(android.content.Context); + java.lang.String get(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setDividerPadding { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setShowDividers { + void getWarnings(com.netcetera.threeds.sdk.infrastructure.setDividerHeight); + com.netcetera.threeds.sdk.infrastructure.setDividerHeight get(); + void ThreeDS2ServiceInstance(); + java.lang.Long getWarnings(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setOrientation { + java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.setVerticalGravity); + java.lang.String ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setDividerHeight); + com.netcetera.threeds.sdk.infrastructure.setDividerHeight getWarnings(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setBaselineAlignedChildIndex { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setBaselineAlignedChildIndex { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setWeightSum { + java.lang.String ThreeDS2Service(); + void get(com.netcetera.threeds.sdk.infrastructure.setFooterDividersEnabled); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMeasureWithLargestChildEnabled { + void ThreeDS2ServiceInstance(java.lang.String); + boolean get(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setItemsCanFocus { + void getWarnings(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setGravity + +-keep class com.netcetera.threeds.sdk.infrastructure.setGravity$initialize { + (); + com.netcetera.threeds.sdk.infrastructure.setGravity$initialize get(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setGravity$initialize ThreeDS2Service(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setGravity ThreeDS2Service(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setVerticalGravity + +-keep class com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize { + (); + com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize ThreeDS2ServiceInstance(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize getWarnings(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize get(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize initialize(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize get(com.netcetera.threeds.sdk.infrastructure.setGravity); + com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize ThreeDS2Service(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize ThreeDS2ServiceInitializationCallback(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setVerticalGravity get(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setHorizontalGravity { + java.lang.String get(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setDividerHeight { + com.netcetera.threeds.sdk.infrastructure.setFooterDividersEnabled get(); + com.netcetera.threeds.sdk.infrastructure.setHorizontalGravity initialize(); + java.lang.String ThreeDS2ServiceInstance(); + java.lang.Boolean ThreeDS2Service(); + java.lang.Object getWarnings(java.lang.Object[],int,int,int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setFooterDividersEnabled + +-keep class com.netcetera.threeds.sdk.infrastructure.setOverscrollHeader { + void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setEdgeEffectColor,java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setDivider { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinWidth { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMinHeight { + java.text.DateFormat initialize;} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinHeight { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinHeight { + void getWarnings(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service { + com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service ThreeDS2ServiceInstance; com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service initialize; com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service ThreeDS2Service; com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service get; java.lang.String get(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgressDrawable { + void getWarnings(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintList { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintList { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode + +-keep class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize { + (java.lang.String,java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize getWarnings(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize ThreeDS2ServiceInstance(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize get(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize initialize(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize getSDKVersion(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize getSDKInfo(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize cleanup(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize ThreeDS2ServiceInitializationCallback(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize createTransaction(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize onCompleted(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize ConfigParameters(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize onError(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize addParam(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode ThreeDS2ServiceInstance(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setProgressTintList { + void ThreeDS2Service(); + void initialize(com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode); + void get(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgressBackgroundTintMode { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgressTintBlendMode { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgressDrawableTiled { + void getWarnings(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setProgressBackgroundTintBlendMode { + void ThreeDS2Service(java.util.List); + java.util.List ThreeDS2ServiceInstance(); + void initialize(java.util.List); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setSecondaryProgressTintBlendMode { + java.lang.String get(java.util.List); + java.lang.String ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setMin); + java.util.List get(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setProgress { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgress { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMax + +-keep class com.netcetera.threeds.sdk.infrastructure.setMax$get { + (); + com.netcetera.threeds.sdk.infrastructure.setMax$get ThreeDS2Service(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setMax$get initialize(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setMax$get get(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setMax$get ThreeDS2ServiceInstance(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setMax$get getWarnings(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setMax$get getSDKVersion(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setMax initialize(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMin { + java.util.List get(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMin$ThreeDS2Service { + (java.lang.String,java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setMin$ThreeDS2Service initialize(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.setMin$ThreeDS2Service getWarnings(com.netcetera.threeds.sdk.infrastructure.setMax); + com.netcetera.threeds.sdk.infrastructure.setMin$ThreeDS2Service ThreeDS2Service(java.util.List); + com.netcetera.threeds.sdk.infrastructure.setMin initialize(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setSecondaryProgress { + void getWarnings(com.netcetera.threeds.sdk.infrastructure.setEdgeEffectColor,java.lang.String); + void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setEdgeEffectColor,java.lang.String,java.lang.String,java.lang.String,java.lang.String); + void ThreeDS2Service(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setInterpolator { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setAutoSizeTextTypeWithDefaults { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMovementMethod + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMovementMethod { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setTypeface { + (com.netcetera.threeds.sdk.api.ThreeDS2Service,android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,com.netcetera.threeds.sdk.api.ui.logic.UiCustomization); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setTransformationMethod { + (com.netcetera.threeds.sdk.api.ThreeDS2Service,android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,java.util.Map); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setKeyListener { + (com.netcetera.threeds.sdk.api.ThreeDS2Service,android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,java.util.Map,com.netcetera.threeds.sdk.api.ThreeDS2Service$InitializationCallback); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawablesRelative { + (com.netcetera.threeds.sdk.api.ThreeDS2Service); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawablePadding { + (com.netcetera.threeds.sdk.api.ThreeDS2Service); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawablesWithIntrinsicBounds { + (com.netcetera.threeds.sdk.api.ThreeDS2Service); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawableTintList { + (com.netcetera.threeds.sdk.api.ThreeDS2Service,android.content.Context); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawablesRelativeWithIntrinsicBounds { + (com.netcetera.threeds.sdk.api.ThreeDS2Service,java.lang.String,java.lang.String); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTextSelectHandleLeft { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setTextCursorDrawable { + com.netcetera.threeds.sdk.api.ThreeDS2Service get(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTextCursorDrawable { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setTextLocales + +-keep class com.netcetera.threeds.sdk.infrastructure.setTextSize { + java.lang.String ThreeDS2Service(java.security.KeyPair); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLocalePreferredLineHeightForMinimumUsed { + void get(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLetterSpacing { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setShiftDrawingOffsetForStartOverhang { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMinimumFontMetrics { + void get(); + void initialize(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setTextMetricsParams + +-keep class com.netcetera.threeds.sdk.infrastructure.setHyphenationFrequency { + java.lang.String getWarnings(); + java.lang.String get(); + java.security.PublicKey ThreeDS2Service(); + java.security.KeyPair initialize(); + java.lang.String cleanup(); + void ThreeDS2ServiceInitializationCallback(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setBreakStrategy { + void get(com.netcetera.threeds.sdk.infrastructure.setExtractedText); + void ThreeDS2Service(); + void ThreeDS2ServiceInstance(); + void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setAllCaps); + void initialize(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLineBreakWordStyle { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setFontFeatureSettings { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setShadowLayer { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHighlightColor { + void initialize(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setPaintFlags { + com.netcetera.threeds.sdk.infrastructure.setMinimumFontMetrics initialize(com.netcetera.threeds.sdk.infrastructure.setTextMetricsParams); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setAutoLinkMask { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLinksClickable { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHintTextColor { + void getWarnings(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setLinkTextColor { + java.lang.String ThreeDS2Service(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setHeight { + java.lang.String ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setLines); + java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.setAllCaps); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setLines { + com.netcetera.threeds.sdk.infrastructure.getClass get(); + java.lang.String getWarnings(); + java.lang.String ThreeDS2Service(); + java.lang.String cleanup(); + com.netcetera.threeds.sdk.infrastructure.getVersion createTransaction(); + com.netcetera.threeds.sdk.infrastructure.addSuppressed getSDKInfo(); + java.lang.String ConfigParameters(); + com.netcetera.threeds.sdk.infrastructure.clear apiKey(); + java.lang.Boolean configureScheme(); + com.netcetera.threeds.sdk.infrastructure.notify visaSchemeConfiguration(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLines { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setHorizontallyScrolling + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHorizontallyScrolling { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHorizontallyScrolling { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMaxLines { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMaxLines { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinLines { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinLines { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setEms { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setEms { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setWidth { + java.lang.String ThreeDS2ServiceInstance(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setFocusedSearchResultIndex { + void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setFilters); + void get(com.netcetera.threeds.sdk.infrastructure.setExtractedText); + void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setAllCaps); + void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHighlights { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSearchResultHighlights { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLineHeight { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setFilters + +-keep class com.netcetera.threeds.sdk.infrastructure.setExtractedText + +-keep class com.netcetera.threeds.sdk.infrastructure.setAllCaps + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller { + void getSDKInfo(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller$ThreeDS2Service { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller$ThreeDS2Service { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller$ThreeDS2ServiceInstance { + void initialize(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCursorVisible { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTitleMarginStart { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLogoDescription { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSubtitleTextAppearance$ThreeDS2ServiceInstance { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTitleTextAppearance { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSubtitle { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTitle { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTitleTextColor { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapseContentDescription { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapseContentDescription { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSubtitleTextColor { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setNavigationOnClickListener { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setNavigationOnClickListener { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setNavigationContentDescription { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setNavigationContentDescription { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setContentInsetsAbsolute { + (java.lang.Runnable); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setContentInsetsRelative { + void initialize(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setCollapseIcon { + com.netcetera.threeds.sdk.infrastructure.setCollapseIcon ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setHyphenationFrequency,com.netcetera.threeds.sdk.infrastructure.fy,com.netcetera.threeds.sdk.infrastructure.setWidth,com.netcetera.threeds.sdk.infrastructure.nc,com.netcetera.threeds.sdk.infrastructure.iz,com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize); + void ThreeDS2Service(java.lang.String,com.netcetera.threeds.sdk.infrastructure.setFocusedSearchResultIndex); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapseIcon { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setContentInsetStartWithNavigation { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapsible { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapsible { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.findFragmentByTag { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.findFragmentById { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.setMenuCallbacks { + java.lang.Object[] ThreeDS2Service(android.content.Context,int,int); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMenuCallbacks { + void init$0(); + void init$1(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.computeValue { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getView { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$4 { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$2 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$2 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$1 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$1 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$3 { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.equals$5 { + void getWarnings(long,long); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$5 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$8 { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.clone { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$3 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$3 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$4 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$1 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$5 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$2 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$6 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$8 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$9 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$9 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$7 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$7 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$10 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$13 { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$12 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$12 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$20 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$18 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$16 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$16 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$19 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$25 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$23 { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.finalize { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.finalize { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.finalize$getWarnings { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.finalize$getWarnings { + void initialize(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.compareTo { + void initialize(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.notify + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.notify { + void ThreeDS2Service(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.getClass { + com.netcetera.threeds.sdk.infrastructure.getClass get;} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getClass { + void initialize(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getDeclaringClass { + void get(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getCause { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getLocalizedMessage { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.wait { + void ThreeDS2Service(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.notifyAll { + void initialize(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.initCause { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.printStackTrace { + void initialize(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.addSuppressed + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.addSuppressed { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setStackTrace { + void initialize(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.fillInStackTrace { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getStackTrace { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getSuppressed { + void initialize(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.getVersion { + com.netcetera.threeds.sdk.infrastructure.getVersion initialize;} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getVersion { + void get(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.load { + void initialize(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.clear + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.clear { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getInfo { + void initialize(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.putAll { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.entrySet { + void ThreeDS2Service(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.remove + +-keep class com.netcetera.threeds.sdk.infrastructure.replaceAll { + void initialize(); + void get(com.netcetera.threeds.sdk.infrastructure.setFilters); + void get(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.computeIfAbsent + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.keys$initialize { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getServices$get { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.contains { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.contains$ThreeDS2Service { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.containsKey { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.save { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.stringPropertyNames { + void initialize(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.aa { + void getWarnings(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ab { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ae { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ag { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ag { + void get(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.af { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.al { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ai { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ai$getWarnings { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ak { + void initialize(long,long); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ap { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ap$getWarnings { + void initialize(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.am { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.am { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.av { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ba { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ay { + void getSDKInfo(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.aw { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bb { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bb$1 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bb$1 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bd$ThreeDS2ServiceInstance { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bi { + void ThreeDS2Service(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bi$5 { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bi$5 { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bk { + void ThreeDS2ServiceInstance(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bn { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bm { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bp { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bp { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bo { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bq { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bt { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bu { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bv { + void initialize(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.cd { + void ThreeDS2ServiceInitializationCallback(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ca { + com.netcetera.threeds.sdk.infrastructure.replaceAll initialize(com.netcetera.threeds.sdk.infrastructure.computeIfAbsent); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ce { + void init$0(); + void init$1(); + void init$2(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.cq { + void getWarnings(long,long); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.cp { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ct { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.di { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ds { + java.lang.Object[] get(android.content.Context,int,int); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ds { + void init$0(); + void init$1(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.dt { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.dy { + void ThreeDS2ServiceInstance(long,long); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.en { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.et { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.et$initialize { + void initialize(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.et$ThreeDS2Service { + void get(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.et$getWarnings { + void getWarnings(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ev { + void get(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.fa { + (com.netcetera.threeds.sdk.api.transaction.Transaction); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.fb { + (com.netcetera.threeds.sdk.api.transaction.Transaction,android.app.Activity,com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeParameters,com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver,int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ex { + (com.netcetera.threeds.sdk.api.transaction.Transaction,com.netcetera.threeds.sdk.api.transaction.Transaction$BridgingMessageExtensionVersion); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.fe { + (com.netcetera.threeds.sdk.api.transaction.Transaction,android.app.Activity); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.fd { + (com.netcetera.threeds.sdk.api.transaction.Transaction); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.fh { + com.netcetera.threeds.sdk.infrastructure.setHorizontallyScrolling get(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.fy + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ga { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ii { + boolean ThreeDS2ServiceInstance(); + void getWarnings(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ii { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ig { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ie { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ij { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.in { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.remove); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.im { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setFilters); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ik { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setExtractedText); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.il { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setAllCaps); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ip { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ir { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.is { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.iq { + (com.netcetera.threeds.sdk.infrastructure.setTextLocales); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.io { + com.netcetera.threeds.sdk.infrastructure.setLines initialize(); + com.netcetera.threeds.sdk.infrastructure.setLines ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.remove); + com.netcetera.threeds.sdk.infrastructure.setAllCaps get(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.it { + com.netcetera.threeds.sdk.infrastructure.setHorizontalScrollbarOverlay initialize(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.it { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.iv { + com.netcetera.threeds.sdk.api.transaction.Transaction get(com.netcetera.threeds.sdk.infrastructure.getErrorComponent,com.netcetera.threeds.sdk.infrastructure.getTransactionStatus,com.netcetera.threeds.sdk.infrastructure.setScrollBarSize,com.netcetera.threeds.sdk.infrastructure.lx,com.netcetera.threeds.sdk.infrastructure.jo,com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings,java.lang.String,java.lang.String,com.netcetera.threeds.sdk.infrastructure.nc,com.netcetera.threeds.sdk.infrastructure.setProgressTintList,com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.iz + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ja { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.je { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jh { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jj { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.jo + +-keep class com.netcetera.threeds.sdk.infrastructure.jr { + com.netcetera.threeds.sdk.infrastructure.jo ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.api.ui.logic.UiCustomization,com.netcetera.threeds.sdk.infrastructure.lx); + com.netcetera.threeds.sdk.infrastructure.jo getWarnings(java.util.Map,com.netcetera.threeds.sdk.infrastructure.lx); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.js { + com.netcetera.threeds.sdk.api.ui.logic.UiCustomization ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.api.ui.logic.UiCustomization); + java.util.Map ThreeDS2Service(java.util.Map); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.js { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.js { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jw { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jw { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jy { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jy { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ka { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ka { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jz { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jz { + void get(); + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jx { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ke { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ke { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kf { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kf { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kd { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kd { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kg { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kg { + void getWarnings(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kl { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ki { + void get(long,long); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ki { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kk { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ln { + void init$0(); + void init$1(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.lx + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mc { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.md { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mb { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mf { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mn { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mo { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mk$initialize { + void getWarnings(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ml { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mt { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mt { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ms { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ms { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mq { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.mp { + java.lang.Object getWarnings(java.lang.Object[],int,int,int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.my { + java.lang.Object initialize(java.lang.Object[],int,int,int); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.my$ThreeDS2ServiceInstance + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mv { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.mw + +-keep class com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance { + com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance initialize; com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance ThreeDS2Service; com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance ThreeDS2ServiceInstance;} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.na { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mz { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.nd { + (java.lang.Object); + java.lang.String get(java.lang.String); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nd { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nb { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nb { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.nc { + com.netcetera.threeds.sdk.infrastructure.nc initialize(com.netcetera.threeds.sdk.api.configparameters.ConfigParameters); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nc { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.nf { + void ThreeDS2ServiceInstance(java.lang.Object,java.lang.String); + java.lang.String getWarnings(java.lang.String,java.lang.String); + void ThreeDS2ServiceInstance(int,int,java.lang.String); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nf { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ni { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ne { + (); + void ThreeDS2ServiceInstance(java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ng { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ng { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nj { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nj { + void init$0(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nm { + void getWarnings(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.nr { + com.netcetera.threeds.sdk.infrastructure.nr ThreeDS2ServiceInstance(java.lang.String); + java.lang.String ThreeDS2Service(java.lang.String); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nr { + void getWarnings(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.no { + void get(java.lang.String); + void getWarnings(java.lang.String,java.lang.Object[]); + void initialize(java.lang.String); + void ThreeDS2Service(java.lang.String,java.lang.Object[]); + void getWarnings(java.lang.String,com.netcetera.threeds.sdk.infrastructure.nc); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.nq { + java.lang.Object ThreeDS2Service(java.lang.Object[],int,int,int); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nq { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.np { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ob { + java.lang.String[] getWarnings(java.lang.Object[]); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ob { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.og { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.oh { + java.lang.CharSequence getWarnings(java.lang.CharSequence,java.lang.CharSequence); + boolean ThreeDS2ServiceInstance(java.lang.CharSequence); + boolean get(java.lang.CharSequence); + boolean get(java.lang.CharSequence,java.lang.CharSequence); + boolean ThreeDS2Service(java.lang.CharSequence,java.lang.CharSequence); + boolean initialize(java.lang.CharSequence); + java.lang.String[] ThreeDS2ServiceInstance(java.lang.String,java.lang.String); + boolean ThreeDS2Service(java.lang.CharSequence[]); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oh { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.of { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.oe { + java.lang.Long getWarnings;} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oe { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.oi { + java.util.Date initialize(java.util.Date,int); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oi { + (); +} + +-keep class org.bouncycastle.jce.provider.NcaBouncyCastleProvider { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class org.bouncycastle.jce.provider.NcaBouncyCastleProvider { + void ThreeDS2ServiceInstance(); + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ok { + java.lang.String get(byte[]); + byte[] ThreeDS2Service(java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ok { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.om { + (); + byte[] ThreeDS2ServiceInstance(java.lang.String); + java.lang.String get(java.lang.String); + java.lang.String initialize(byte[]); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oj { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ol { + java.lang.Object[] initialize(int,int); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ol { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ol$get { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.oq { + (); + com.netcetera.threeds.sdk.infrastructure.oq$ThreeDS2Service initialize(); + com.netcetera.threeds.sdk.infrastructure.oq$ThreeDS2Service getWarnings(); + java.security.SecureRandom ThreeDS2ServiceInstance(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.oq$ThreeDS2Service { + void get(java.lang.String); + java.lang.String ThreeDS2ServiceInstance(); + java.lang.String ThreeDS2Service(); + void ThreeDS2Service(java.lang.String); + java.lang.String initialize(); + void getWarnings(java.lang.String); + void initialize(java.lang.String); + java.lang.String getWarnings(); + void ThreeDS2ServiceInstance(java.lang.String); + java.lang.String cleanup(); + void ThreeDS2ServiceInitializationCallback(java.lang.String); + java.lang.String createTransaction(); + void createTransaction(java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oo { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oo$4 { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oo$get { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.or { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.on { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ot { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ov { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.pb { + java.lang.String ThreeDS2Service(); + boolean getWarnings(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.pa { + boolean ThreeDS2ServiceInstance(java.lang.String,java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.pa { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.oz { + com.netcetera.threeds.sdk.infrastructure.oz ThreeDS2ServiceInstance; (com.netcetera.threeds.sdk.infrastructure.oz$ThreeDS2ServiceInstance,java.lang.String[]); + void ThreeDS2ServiceInstance(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.oz$ThreeDS2ServiceInstance { + com.netcetera.threeds.sdk.infrastructure.oz$ThreeDS2ServiceInstance ThreeDS2Service;} + +-keep class com.netcetera.threeds.sdk.infrastructure.pf { + com.netcetera.threeds.sdk.infrastructure.pb getWarnings(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.pe { + com.netcetera.threeds.sdk.infrastructure.pe get(); + com.netcetera.threeds.sdk.infrastructure.pf ThreeDS2ServiceInstance(); + com.netcetera.threeds.sdk.infrastructure.pf getWarnings(); + com.netcetera.threeds.sdk.infrastructure.pf initialize(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.pd { + org.slf4j.Logger get; java.lang.String ThreeDS2ServiceInstance; java.lang.String initialize; (); + void ThreeDS2Service(java.lang.String); + void get(java.lang.String); + java.lang.String ThreeDS2ServiceInstance(); + java.lang.String ThreeDS2Service(); + void initialize(com.netcetera.threeds.sdk.infrastructure.rd); + void getWarnings(java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qc { + com.netcetera.threeds.sdk.infrastructure.qe getWarnings(java.security.spec.ECParameterSpec); + com.netcetera.threeds.sdk.infrastructure.qe ThreeDS2Service(java.security.spec.ECParameterSpec,java.lang.String,java.security.SecureRandom); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qc { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qe { + java.security.interfaces.ECPublicKey ThreeDS2Service(); + java.security.interfaces.ECPrivateKey initialize(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qd { + java.security.Key ThreeDS2ServiceInitializationCallback(); + void initialize(java.lang.String); + java.lang.String cleanup(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qd$ThreeDS2ServiceInstance { + com.netcetera.threeds.sdk.infrastructure.qd get(java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qd$ThreeDS2ServiceInstance { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qk { + java.security.PrivateKey onError(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qk$getWarnings { + com.netcetera.threeds.sdk.infrastructure.qk ThreeDS2Service(java.security.Key); + com.netcetera.threeds.sdk.infrastructure.qk initialize(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.qk ThreeDS2Service(java.lang.String,java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qk$getWarnings { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qj$getWarnings { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qj$ThreeDS2Service { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qj$ThreeDS2ServiceInstance { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ql$ThreeDS2Service { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ql$ThreeDS2ServiceInstance { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ql$get { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qo { + (); + boolean getWarnings(); + java.lang.String getSDKVersion(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qp { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$initialize { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$ThreeDS2ServiceInstance { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$ThreeDS2Service { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$getWarnings { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qm$get { + void get(long,long); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$get { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$getSDKInfo { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qs { + java.lang.String ThreeDS2Service(java.lang.String[]); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qs { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qu { + void ThreeDS2Service(java.lang.String,java.lang.String); + void initialize(java.lang.String,java.lang.Object); + void ThreeDS2ServiceInstance(java.lang.String,com.netcetera.threeds.sdk.infrastructure.qd); + java.lang.String initialize(java.lang.String); + java.lang.Long ThreeDS2Service(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.qk get(java.lang.String,java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qu { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qt { + byte[] initialize; (); + void get(java.lang.String[]); + void get(java.lang.String); + java.lang.String onCompleted(); + void get(java.lang.String,java.lang.String); + void getSDKVersion(java.lang.String); + com.netcetera.threeds.sdk.infrastructure.qu onError(); + void ThreeDS2ServiceInstance(java.lang.String,java.lang.String); + java.lang.String cleanup(java.lang.String); + void createTransaction(java.lang.String); + java.lang.String addParam(); + void ThreeDS2ServiceInitializationCallback(java.lang.String); + java.security.Key getParamValue(); + void initialize(java.security.Key); + byte[] restrictedParameters(); + void ThreeDS2Service(byte[]); + boolean apiKey(); + com.netcetera.threeds.sdk.infrastructure.oz ConfigurationBuilder(); + void initialize(com.netcetera.threeds.sdk.infrastructure.oz); + void configureScheme(); + com.netcetera.threeds.sdk.infrastructure.oq removeParam(); + void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.oq); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qq { + void get(java.security.Key); + java.security.Key get(java.security.Key,java.lang.Class); + void ThreeDS2Service(java.security.Key); + void ThreeDS2Service(java.security.Key,java.lang.String,int); + java.lang.Object get(java.lang.Object[],int,int,int); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qq { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qq { + void init$0(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qr { + (byte[]); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qr { + void init$0(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qz { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qw { + (); + boolean ThreeDS2ServiceInstance(); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qy { + java.security.spec.ECParameterSpec ThreeDS2ServiceInstance; java.lang.String getWarnings(java.security.spec.EllipticCurve); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qy { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.qv { + (byte[]); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rd { + com.netcetera.threeds.sdk.infrastructure.rd get; com.netcetera.threeds.sdk.infrastructure.rd ThreeDS2ServiceInstance;} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.re { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ra { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rc { + byte[] ThreeDS2Service; byte[] initialize(int); + byte[] ThreeDS2ServiceInstance(long); + boolean getWarnings(byte[],byte[]); + byte[] initialize(byte[][]); + byte[] ThreeDS2ServiceInstance(byte[],int,int); + byte[] ThreeDS2ServiceInstance(byte[]); + byte[] getWarnings(byte[]); + int initialize(byte[]); + int getWarnings(int); + int ThreeDS2ServiceInstance(int); + byte[] ThreeDS2Service(int,java.security.SecureRandom); + byte[] get(int); + java.lang.String get(byte[]); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rc { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rb { + java.lang.String getWarnings(java.lang.Throwable); + java.lang.String ThreeDS2ServiceInstance(java.lang.Throwable,java.lang.Class); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rb { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rg { + java.security.MessageDigest getWarnings(java.lang.String); + java.security.MessageDigest ThreeDS2ServiceInstance(java.lang.String,java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rg { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rj { + (java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ri { + (java.lang.String); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rh { + (java.lang.String); + (java.lang.String,java.lang.Throwable); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rf { + (java.lang.String); + (java.lang.String,java.lang.Throwable); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rk { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rl { + java.lang.String initialize(byte[],java.lang.String); + byte[] ThreeDS2ServiceInstance(java.lang.String); + byte[] getWarnings(java.lang.String); + byte[] getWarnings(java.lang.String,java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rl { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rn { + (java.lang.String); + (java.lang.String,java.lang.Throwable); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.rm { + javax.crypto.Mac initialize(java.lang.String,java.security.Key,java.lang.String); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rm { + (); +} + +-keep class com.netcetera.threeds.sdk.infrastructure.ro { + byte[] initialize(byte[]); + byte[] ThreeDS2Service(byte[]); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rr { + (); +} + +-keepclassmembers,allowobfuscation class androidx.activity.ComponentActivity { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.activity.ComponentActivity { + (int); + void onCreate(android.os.Bundle); + void onSaveInstanceState(android.os.Bundle); + java.lang.Object onRetainNonConfigurationInstance(); + java.lang.Object onRetainCustomNonConfigurationInstance(); + java.lang.Object getLastCustomNonConfigurationInstance(); + void setContentView(int); + void setContentView(android.view.View,android.view.ViewGroup$LayoutParams); + void addContentView(android.view.View,android.view.ViewGroup$LayoutParams); + android.content.Context peekAvailableContext(); + void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener); + void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener); + boolean onPreparePanel(int,android.view.View,android.view.Menu); + boolean onCreatePanelMenu(int,android.view.Menu); + boolean onMenuItemSelected(int,android.view.MenuItem); + void onPanelClosed(int,android.view.Menu); + void addMenuProvider(androidx.core.view.MenuProvider); + void addMenuProvider(androidx.core.view.MenuProvider,androidx.lifecycle.LifecycleOwner); + void addMenuProvider(androidx.core.view.MenuProvider,androidx.lifecycle.LifecycleOwner,androidx.lifecycle.Lifecycle$State); + void removeMenuProvider(androidx.core.view.MenuProvider); + void invalidateMenu(); + androidx.lifecycle.Lifecycle getLifecycle(); + androidx.lifecycle.ViewModelStore getViewModelStore(); + androidx.lifecycle.ViewModelProvider$Factory getDefaultViewModelProviderFactory(); + androidx.lifecycle.viewmodel.CreationExtras getDefaultViewModelCreationExtras(); + void onBackPressed(); + androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher(); + androidx.savedstate.SavedStateRegistry getSavedStateRegistry(); + void startActivityForResult(android.content.Intent,int); + void startActivityForResult(android.content.Intent,int,android.os.Bundle); + void startIntentSenderForResult(android.content.IntentSender,int,android.content.Intent,int,int,int); + void startIntentSenderForResult(android.content.IntentSender,int,android.content.Intent,int,int,int,android.os.Bundle); + void onActivityResult(int,int,android.content.Intent); + void onRequestPermissionsResult(int,java.lang.String[],int[]); + androidx.activity.result.ActivityResultLauncher registerForActivityResult(androidx.activity.result.contract.ActivityResultContract,androidx.activity.result.ActivityResultRegistry,androidx.activity.result.ActivityResultCallback); + androidx.activity.result.ActivityResultLauncher registerForActivityResult(androidx.activity.result.contract.ActivityResultContract,androidx.activity.result.ActivityResultCallback); + androidx.activity.result.ActivityResultRegistry getActivityResultRegistry(); + void onConfigurationChanged(android.content.res.Configuration); + void addOnConfigurationChangedListener(androidx.core.util.Consumer); + void removeOnConfigurationChangedListener(androidx.core.util.Consumer); + void onTrimMemory(int); + void addOnTrimMemoryListener(androidx.core.util.Consumer); + void removeOnTrimMemoryListener(androidx.core.util.Consumer); + void onNewIntent(android.content.Intent); + void addOnNewIntentListener(androidx.core.util.Consumer); + void removeOnNewIntentListener(androidx.core.util.Consumer); + void onMultiWindowModeChanged(boolean); + void onMultiWindowModeChanged(boolean,android.content.res.Configuration); + void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer); + void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer); + void onPictureInPictureModeChanged(boolean); + void onPictureInPictureModeChanged(boolean,android.content.res.Configuration); + void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer); + void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer); + void reportFullyDrawn(); +} + +-keep class androidx.activity.contextaware.OnContextAvailableListener + +-keep class androidx.activity.OnBackPressedDispatcher + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.activity.OnBackPressedDispatcher { + (); +} + +-keep class androidx.activity.contextaware.OnContextAvailableListener + +-keep class androidx.activity.result.ActivityResultCallback + +-keep class androidx.activity.result.ActivityResultLauncher + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.activity.result.ActivityResultLauncher { + (); +} + +-keep class androidx.activity.result.ActivityResultRegistry + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.activity.result.ActivityResultRegistry { + (); +} + +-keep class androidx.activity.result.contract.ActivityResultContract + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.activity.result.contract.ActivityResultContract { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.appcompat.app.ActionBar { + (); +} + +-keepclassmembers,allowobfuscation class androidx.appcompat.app.AppCompatActivity { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.appcompat.app.AppCompatActivity { + (int); + void attachBaseContext(android.content.Context); + void setTheme(int); + void onPostCreate(android.os.Bundle); + androidx.appcompat.app.ActionBar getSupportActionBar(); + void setSupportActionBar(androidx.appcompat.widget.Toolbar); + android.view.MenuInflater getMenuInflater(); + void setContentView(int); + void setContentView(android.view.View,android.view.ViewGroup$LayoutParams); + void addContentView(android.view.View,android.view.ViewGroup$LayoutParams); + void onConfigurationChanged(android.content.res.Configuration); + void onPostResume(); + void onStart(); + void onStop(); + android.view.View findViewById(int); + boolean onMenuItemSelected(int,android.view.MenuItem); + void onDestroy(); + void onTitleChanged(java.lang.CharSequence,int); + boolean supportRequestWindowFeature(int); + void supportInvalidateOptionsMenu(); + void invalidateOptionsMenu(); + void onSupportActionModeStarted(androidx.appcompat.view.ActionMode); + void onSupportActionModeFinished(androidx.appcompat.view.ActionMode); + androidx.appcompat.view.ActionMode onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode$Callback); + androidx.appcompat.view.ActionMode startSupportActionMode(androidx.appcompat.view.ActionMode$Callback); + void setSupportProgressBarVisibility(boolean); + void setSupportProgressBarIndeterminateVisibility(boolean); + void setSupportProgressBarIndeterminate(boolean); + void setSupportProgress(int); + void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder); + void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder); + boolean onSupportNavigateUp(); + android.content.Intent getSupportParentActivityIntent(); + boolean supportShouldUpRecreateTask(android.content.Intent); + void supportNavigateUpTo(android.content.Intent); + void onContentChanged(); + void onSupportContentChanged(); + androidx.appcompat.app.ActionBarDrawerToggle$Delegate getDrawerToggleDelegate(); + boolean onMenuOpened(int,android.view.Menu); + void onPanelClosed(int,android.view.Menu); + androidx.appcompat.app.AppCompatDelegate getDelegate(); + boolean dispatchKeyEvent(android.view.KeyEvent); + android.content.res.Resources getResources(); + boolean onKeyDown(int,android.view.KeyEvent); + void openOptionsMenu(); + void closeOptionsMenu(); + void onNightModeChanged(int); + void onLocalesChanged(androidx.core.os.LocaleListCompat); +} + +-keep class androidx.appcompat.app.ActionBar + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.appcompat.app.AppCompatCallback { + void onSupportActionModeStarted(androidx.appcompat.view.ActionMode); + void onSupportActionModeFinished(androidx.appcompat.view.ActionMode); + androidx.appcompat.view.ActionMode onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode$Callback); +} + +-keep class androidx.appcompat.view.ActionMode + +-keep class androidx.appcompat.app.AppCompatDelegate + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.appcompat.app.AppCompatDelegate { + int MODE_NIGHT_FOLLOW_SYSTEM; int MODE_NIGHT_AUTO_TIME; int MODE_NIGHT_AUTO; int MODE_NIGHT_NO; int MODE_NIGHT_YES; int MODE_NIGHT_AUTO_BATTERY; int MODE_NIGHT_UNSPECIFIED; int FEATURE_SUPPORT_ACTION_BAR; int FEATURE_SUPPORT_ACTION_BAR_OVERLAY; int FEATURE_ACTION_MODE_OVERLAY; androidx.appcompat.app.AppCompatDelegate create(android.app.Activity,androidx.appcompat.app.AppCompatCallback); + androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog,androidx.appcompat.app.AppCompatCallback); + androidx.appcompat.app.AppCompatDelegate create(android.content.Context,android.view.Window,androidx.appcompat.app.AppCompatCallback); + androidx.appcompat.app.AppCompatDelegate create(android.content.Context,android.app.Activity,androidx.appcompat.app.AppCompatCallback); + androidx.appcompat.app.ActionBar getSupportActionBar(); + void setSupportActionBar(androidx.appcompat.widget.Toolbar); + android.view.MenuInflater getMenuInflater(); + void onCreate(android.os.Bundle); + void onPostCreate(android.os.Bundle); + void onConfigurationChanged(android.content.res.Configuration); + void onStart(); + void onStop(); + void onPostResume(); + void setTheme(int); + android.view.View findViewById(int); + void setContentView(android.view.View); + void setContentView(int); + void setContentView(android.view.View,android.view.ViewGroup$LayoutParams); + void addContentView(android.view.View,android.view.ViewGroup$LayoutParams); + void attachBaseContext(android.content.Context); + android.content.Context attachBaseContext2(android.content.Context); + void setTitle(java.lang.CharSequence); + void invalidateOptionsMenu(); + void onDestroy(); + androidx.appcompat.app.ActionBarDrawerToggle$Delegate getDrawerToggleDelegate(); + boolean requestWindowFeature(int); + boolean hasWindowFeature(int); + androidx.appcompat.view.ActionMode startSupportActionMode(androidx.appcompat.view.ActionMode$Callback); + void installViewFactory(); + android.view.View createView(android.view.View,java.lang.String,android.content.Context,android.util.AttributeSet); + void setHandleNativeActionModesEnabled(boolean); + boolean isHandleNativeActionModesEnabled(); + void onSaveInstanceState(android.os.Bundle); + boolean applyDayNight(); + void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher); + android.content.Context getContextForDelegate(); + void setLocalNightMode(int); + int getLocalNightMode(); + void setDefaultNightMode(int); + void setApplicationLocales(androidx.core.os.LocaleListCompat); + androidx.core.os.LocaleListCompat getApplicationLocales(); + int getDefaultNightMode(); + void setCompatVectorFromResourcesEnabled(boolean); + boolean isCompatVectorFromResourcesEnabled(); +} + +-keep class androidx.appcompat.view.ActionMode + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.appcompat.view.ActionMode { + (); +} + +-keep class androidx.appcompat.view.ActionMode$Callback + +-keep class androidx.appcompat.widget.Toolbar + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.core.app.ActivityCompat$OnRequestPermissionsResultCallback { + void onRequestPermissionsResult(int,java.lang.String[],int[]); +} + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.core.app.ActivityCompat$RequestPermissionsRequestCodeValidator { + void validateRequestPermissionsRequestCode(int); +} + +-keepclassmembers,allowobfuscation class androidx.core.app.ComponentActivity { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.core.app.ComponentActivity { + void putExtraData(androidx.core.app.ComponentActivity$ExtraData); + void onCreate(android.os.Bundle); + void onSaveInstanceState(android.os.Bundle); + androidx.core.app.ComponentActivity$ExtraData getExtraData(java.lang.Class); + androidx.lifecycle.Lifecycle getLifecycle(); + boolean superDispatchKeyEvent(android.view.KeyEvent); + boolean dispatchKeyShortcutEvent(android.view.KeyEvent); + boolean dispatchKeyEvent(android.view.KeyEvent); + boolean shouldDumpInternalState(java.lang.String[]); +} + +-keep class androidx.core.app.ComponentActivity$ExtraData + +-keep class androidx.core.app.ComponentActivity$ExtraData + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.core.app.ComponentActivity$ExtraData { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.core.app.SharedElementCallback { + (); +} + +-keep class androidx.core.app.TaskStackBuilder + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.core.content.res.ResourcesCompat { + int ID_NULL; void clearCachesForTheme(android.content.res.Resources$Theme); + android.graphics.drawable.Drawable getDrawable(android.content.res.Resources,int,android.content.res.Resources$Theme); + android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources,int,int,android.content.res.Resources$Theme); + int getColor(android.content.res.Resources,int,android.content.res.Resources$Theme); + android.content.res.ColorStateList getColorStateList(android.content.res.Resources,int,android.content.res.Resources$Theme); + float getFloat(android.content.res.Resources,int); + android.graphics.Typeface getFont(android.content.Context,int); + android.graphics.Typeface getCachedFont(android.content.Context,int); + void getFont(android.content.Context,int,androidx.core.content.res.ResourcesCompat$FontCallback,android.os.Handler); + android.graphics.Typeface getFont(android.content.Context,int,android.util.TypedValue,int,androidx.core.content.res.ResourcesCompat$FontCallback); +} + +-keep class androidx.core.content.res.ResourcesCompat$FontCallback + +-keep class androidx.core.content.res.ResourcesCompat$FontCallback + +-keepclassmembers,allowobfuscation class androidx.core.content.res.ResourcesCompat$FontCallback { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.core.content.res.ResourcesCompat$FontCallback { + void onFontRetrieved(android.graphics.Typeface); + void onFontRetrievalFailed(int); + void callbackSuccessAsync(android.graphics.Typeface,android.os.Handler); + void callbackFailAsync(int,android.os.Handler); + android.os.Handler getHandler(android.os.Handler); +} + +-keep class androidx.core.os.LocaleListCompat + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.core.os.LocaleListCompat { + androidx.core.os.LocaleListCompat wrap(java.lang.Object); + androidx.core.os.LocaleListCompat wrap(android.os.LocaleList); + java.lang.Object unwrap(); + androidx.core.os.LocaleListCompat create(java.util.Locale[]); + java.util.Locale get(int); + boolean isEmpty(); + int size(); + int indexOf(java.util.Locale); + java.lang.String toLanguageTags(); + java.util.Locale getFirstMatch(java.lang.String[]); + androidx.core.os.LocaleListCompat getEmptyLocaleList(); + androidx.core.os.LocaleListCompat forLanguageTags(java.lang.String); + androidx.core.os.LocaleListCompat getAdjustedDefault(); + androidx.core.os.LocaleListCompat getDefault(); + boolean matchesLanguageAndScript(java.util.Locale,java.util.Locale); + boolean equals(java.lang.Object); + int hashCode(); + java.lang.String toString(); +} + +-keep class androidx.core.util.Consumer + +-keep class androidx.core.view.MenuProvider + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.DialogFragment { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.Fragment { + (); +} + +-keepclassmembers,allowobfuscation class androidx.fragment.app.FragmentActivity { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class androidx.fragment.app.FragmentActivity { + (int); + void onActivityResult(int,int,android.content.Intent); + void supportFinishAfterTransition(); + void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback); + void setExitSharedElementCallback(androidx.core.app.SharedElementCallback); + void supportPostponeEnterTransition(); + void supportStartPostponedEnterTransition(); + void onMultiWindowModeChanged(boolean); + void onPictureInPictureModeChanged(boolean); + void onConfigurationChanged(android.content.res.Configuration); + void onCreate(android.os.Bundle); + boolean onCreatePanelMenu(int,android.view.Menu); + android.view.View onCreateView(android.view.View,java.lang.String,android.content.Context,android.util.AttributeSet); + android.view.View onCreateView(java.lang.String,android.content.Context,android.util.AttributeSet); + void onDestroy(); + void onLowMemory(); + boolean onMenuItemSelected(int,android.view.MenuItem); + void onPanelClosed(int,android.view.Menu); + void onPause(); + void onNewIntent(android.content.Intent); + void onStateNotSaved(); + void onResume(); + void onPostResume(); + void onResumeFragments(); + boolean onPreparePanel(int,android.view.View,android.view.Menu); + boolean onPrepareOptionsPanel(android.view.View,android.view.Menu); + void onStart(); + void onStop(); + void supportInvalidateOptionsMenu(); + void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[]); + void onAttachFragment(androidx.fragment.app.Fragment); + androidx.fragment.app.FragmentManager getSupportFragmentManager(); + androidx.loader.app.LoaderManager getSupportLoaderManager(); + void validateRequestPermissionsRequestCode(int); + void onRequestPermissionsResult(int,java.lang.String[],int[]); + void startActivityFromFragment(androidx.fragment.app.Fragment,android.content.Intent,int); + void startActivityFromFragment(androidx.fragment.app.Fragment,android.content.Intent,int,android.os.Bundle); + void startIntentSenderFromFragment(androidx.fragment.app.Fragment,android.content.IntentSender,int,android.content.Intent,int,int,int,android.os.Bundle); +} + +-keep class androidx.core.app.SharedElementCallback + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.FragmentFactory { + (); +} + +-keep class androidx.fragment.app.FragmentManager + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.FragmentManager { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.FragmentManager$FragmentLifecycleCallbacks { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.FragmentTransaction { + (); +} + +-keep class androidx.lifecycle.Lifecycle + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.lifecycle.Lifecycle { + (); +} + +-keep class androidx.lifecycle.Lifecycle$State + +-keep class androidx.lifecycle.LifecycleOwner + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.lifecycle.LiveData { + (); +} + +-keep class androidx.lifecycle.ViewModelProvider$Factory + +-keep class androidx.lifecycle.ViewModelStore + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.lifecycle.ViewModelStore { + (); +} + +-keep class androidx.lifecycle.viewmodel.CreationExtras + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.lifecycle.viewmodel.CreationExtras { + (); +} + +-keep class androidx.loader.app.LoaderManager + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.loader.app.LoaderManager { + (); +} + +-keep class androidx.savedstate.SavedStateRegistry + +-keepclassmembers,allowoptimization,allowobfuscation class androidx.savedstate.SavedStateRegistry { + (); +} + +-keep class com.google.android.gms.common.GoogleApiAvailability { + int isGooglePlayServicesAvailable(android.content.Context); + com.google.android.gms.common.GoogleApiAvailability getInstance(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.google.android.gms.common.GoogleApiAvailability { + (); +} + +-keep class com.google.android.gms.common.GooglePlayServicesNotAvailableException + +-keep class com.google.android.gms.common.GooglePlayServicesRepairableException + +-keepclassmembers,allowobfuscation class com.google.android.gms.common.api.internal.zabw { + (); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.google.android.gms.common.api.internal.zabw { + void zaa(); +} + +-keepclassmembers,allowshrinking,allowobfuscation class com.google.android.gms.common.api.internal.zabx { + (com.google.android.gms.common.api.internal.zabw); + void onReceive(android.content.Context,android.content.Intent); + void zaa(android.content.Context); + void zab(); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable { + (); +} + +-keep class com.google.android.gms.security.ProviderInstaller { + void installIfNeeded(android.content.Context); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.google.android.gms.security.ProviderInstaller { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class com.google.android.gms.tasks.Task { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.asn1.ASN1Object { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.asn1.ASN1Sequence { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.asn1.ASN1Set { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.jcajce.provider.asymmetric.mlkem.MLKEMKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.jcajce.provider.symmetric.util.ClassUtil { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.jcajce.provider.util.AlgorithmProvider { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.jce.provider.BouncyCastleProvider { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.bike.BIKEKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.cmce.CMCEKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.dilithium.DilithiumKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.falcon.FalconKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.hqc.HQCKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.kyber.KyberKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.lms.LMSKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.newhope.NHKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.ntru.NTRUKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.picnic.PicnicKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.sphincs.Sphincs256KeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.sphincsplus.SPHINCSPlusKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.xmss.XMSSKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.xmss.XMSSMTKeyFactorySpi { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.util.Strings { + (); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.greenrobot.eventbus.EventBus { + (); +} + +-keep class org.slf4j.Logger { + boolean isDebugEnabled(); +} + +-keep class org.slf4j.LoggerFactory { + org.slf4j.Logger getLogger(java.lang.Class); +} + +-keepclassmembers,allowoptimization,allowobfuscation class org.slf4j.helpers.MessageFormatter { + (); +} + +-keepclassmembers !abstract class !com.google.ads.** extends android.view.View { + public (android.content.Context); + public (android.content.Context,android.util.AttributeSet); + public (android.content.Context,android.util.AttributeSet,int); + public void set*(...); +} + +-keepclassmembers !abstract class * { + public (android.content.Context,android.util.AttributeSet); + public (android.content.Context,android.util.AttributeSet,int); +} + +# Enumerations. +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keepclassmembers class * extends javax.net.ssl.SSLSocketFactory { + ** sslParameters; ** context; ** delegate;} + +# ################################# +# Keep # +# # Keep API enumerations ## +-keepclassmembers enum com.netcetera.threeds.sdk.api.** { + ; ; +} + diff --git a/monext/proguard-rules.pro b/monext/proguard-rules.pro index bc50e0f..e89d22b 100644 --- a/monext/proguard-rules.pro +++ b/monext/proguard-rules.pro @@ -20,3443 +20,223 @@ # hide the original source file name. #-renamesourcefileattribute SourceFile -#-------------------------- -#-------------------------- -# Pro Guard Monext Online -#-------------------------- -# Garde les classes principales publiques du SDK en clair --keep public class com.monext.sdk.PaymentBox { - public ; # Toutes les méthodes publiques - public ; # Tous les champs publics -} --keep public class com.monext.sdk.PaymentSheet { - public ; # Toutes les méthodes publiques - public ; # Tous les champs publics -} - -# Garde TOUT dans ces classes (constructeurs, méthodes, champs) --keep public class com.monext.sdk.PaymentResult { *; } --keep public class com.monext.sdk.Appearance { *; } --keep public class com.monext.sdk.GooglePayConfiguration { *; } --keep public class com.monext.sdk.MnxtEnvironment { *; } --keep public class com.monext.sdk.MnxtSDKConfiguration { *; } --keep public class com.monext.sdk.MnxtSDKContext { *; } - -# ============================================ -# Ces attributs sont nécessaires pour la réflexion et le debugging -# Garde les annotations (utilisées par Retrofit, Gson, etc.) --keepattributes *Annotation* -# Garde les signatures génériques (nécessaire pour Gson/Retrofit avec types génériques) --keepattributes Signature -# Garde les exceptions (pour les stack traces lisibles) --keepattributes Exceptions -# Garde les classes internes (souvent utilisées dans Android) --keepattributes InnerClasse -# Garde les méthodes englobantes (pour les classes anonymes) --keepattributes EnclosingMethod - -# ============================================ -# SECTION : KOTLINX SERIALIZATION -# Garde les annotations de serialization --keepattributes RuntimeVisibleAnnotations,RuntimeVisibleParameterAnnotations -# Garde les classes annotées avec @Serializable --keepclassmembers @kotlinx.serialization.Serializable class ** { - *** Companion; - *** INSTANCE; - kotlinx.serialization.KSerializer serializer(...); -} -# Garde les serializers générés --keep class **$$serializer { *; } -# Garde les @Serializable --keep @kotlinx.serialization.Serializable class * { *; } - -# ============================================ -# SECTION : JETPACK COMPOSE -# Règles pour Compose --keep class androidx.compose.** { *; } --keep class androidx.lifecycle.** { *; } -# Garde les ViewModels --keep class * extends androidx.lifecycle.ViewModel { *; } - -# ============================================ -# SECTION : GOOGLE PAY (play-services-wallet) --keep class com.google.android.gms.wallet.** { *; } --keep class com.google.android.gms.common.** { *; } --keep class com.google.android.gms.tasks.** { *; } - -# ============================================ -# SECTION : KOTLIN -# Ignore les warnings Kotlin --dontwarn kotlin.** -# Garde les métadonnées Kotlin (pour la réflexion) --keep class kotlin.Metadata { *; } -# Garde les mappings when (générés par le compilateur Kotlin) --keepclassmembers class **$WhenMappings { - ; -} -# Garde les classes compagnon (companion objects) --keep class **$Companion { *; } - -# Coroutines --keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} --keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} --keepclassmembers class kotlinx.coroutines.** { - volatile ; -} - -# ============================================ -# SECTION : SUPPRESSION DES LOGS -# Cette règle supprime complètement les appels de log du bytecode final -# Très important pour la sécurité : pas de logs en production ! --assumenosideeffects class android.util.Log { - public static boolean isLoggable(java.lang.String, int); - public static int v(...); # Verbose - public static int i(...); # Info - public static int w(...); # Warning - public static int d(...); # Debug - public static int e(...); # Error - public static int wtf(...); # What a Terrible Failure -} - -# SLF4J (tu utilises slf4j-api) --assumenosideeffects class org.slf4j.Logger { - public void trace(...); - public void debug(...); - public void info(...); -} - -# Supprime aussi les println (si vous en avez) --assumenosideeffects class java.io.PrintStream { - public void println(...); - public void print(...); -} - # ============================================ -# SECTION : OPTIMISATIONS -# Nombre de passes d'optimisation (plus = plus optimisé mais plus lent) --optimizationpasses 5 -# Ne pas utiliser des noms de classes avec casse mixte après obfuscation --dontusemixedcaseclassnames -# Ne pas ignorer les bibliothèques non publiques --dontskipnonpubliclibraryclasses -# Ne pas pré-vérifier (non nécessaire pour Android) --dontpreverify -# Mode verbose pour le debugging des règles ProGuard --verbose -# Optimisations à appliquer -# ! signifie "ne pas appliquer" --optimizations !code/simplification/arithmetic,!field/*,!class/merging/* - +# MONEXT SDK - ProGuard Rules # ============================================ -# SECTION : DEBUGGING -Garde les infos pour analyser les crash reports -# Garde les numéros de ligne (pour les stack traces) -# IMPORTANT : Permet de débugger même après obfuscation --keepattributes SourceFile,LineNumberTable -# Renomme le fichier source pour cacher le vrai nom --renamesourcefileattribute SourceFile - --keep @kotlinx.parcelize.Parcelize class * { *; } - -#-------------------------- -#-------------------------- -# Copy from Netcetera Bundle -# https://3dss.netcetera.com/3dssdk/doc/2.25.0/android-integration -#-------------------------- --keeppackagenames com.netcetera.threeds.sdk.api.info,com.netcetera.threeds.sdk.api,com.netcetera.threeds.sdk.api.configparameters,com.netcetera.threeds.sdk.api.ui.logic,com.netcetera.threeds.sdk.infrastructure,com.netcetera.threeds.sdk.api.security,com.netcetera.threeds.sdk.api.transaction.challenge,com.netcetera.threeds.sdk.api.exceptions,org.bouncycastle.jce.provider,com.netcetera.threeds.sdk.api.transaction,com.netcetera.threeds.sdk.api.ui,com.netcetera.threeds.sdk.api.transaction.challenge.events --adaptresourcefilecontents !jni/arm64-v8a/libae63.so,!jni/armeabi-v7a/libae63.so,!jni/x86/libae63.so,!jni/x86_64/libae63.so,!lib/arm64-v8a/libae63.so,!lib/armeabi-v7a/libae63.so,!lib/x86/libae63.so,!lib/x86_64/libae63.so,dummyfile --dontwarn proguard.annotation.** - -# Keep everyting in the Netcetera Android 3DS SDK package --keep public class com.netcetera.threeds.sdk.** { - public protected ; public protected ; -} - --keep,allowshrinking class com.netcetera.threeds.sdk.** { - ; ; -} - -# Keep everyting in Guardsquare Dexguard --keep public class com.guardsquare.dexguard.** { - public protected ; public protected ; -} - -# Keep everything from bouncycastle --keep class org.bouncycastle.** { - ; ; -} - --keep,allowshrinking class org.bouncycastle.** { - ; ; -} - -# Keep the classes from slf4j --keep class org.slf4j.** { - ; ; -} - -# Keep kotlin.KotlinVersion if present --keep class kotlin.KotlinVersion { - ; ; -} - --keep class com.netcetera.threeds.sdk.infrastructure.ThreeDS2Service { - byte[][] getWarnings(int); -} - --keep class com.netcetera.threeds.sdk.infrastructure.get { - byte[] ThreeDS2Service; int[] ThreeDS2ServiceInstance; int[] getWarnings; int[] get; int[] initialize; int ThreeDS2ServiceInitializationCallback; int[] cleanup; byte[][] getSDKInfo; int[] createTransaction; byte[] getSDKVersion; byte[] onError; int addParam; int getParamValue; int onCompleted; int ConfigParameters; int apiKey; int ConfigurationBuilder; (java.io.InputStream,int,byte[],byte[][]); - (java.io.InputStream,int,byte[],byte[][],int,int); - int read(); - int read(byte[]); - int read(byte[],int,int); - long skip(long); - int available(); - void close(); - boolean markSupported(); - void mark(int); - void reset(); - byte[][] ThreeDS2ServiceInstance(byte[][]); - int get(); - void get(byte[],int,byte[],int); - void initialize(); - void (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ThreeDS2ServiceInstance { - void getWarnings(byte[],byte,long); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ThreeDS2ServiceInitializationCallback { - int getWarnings; (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.createTransaction { - int getWarnings; int get; int ThreeDS2Service; (); - void ThreeDS2Service(int[]); - int getWarnings(int); -} - --keep class com.netcetera.threeds.sdk.infrastructure.getSDKInfo { - int getWarnings; int ThreeDS2Service; int initialize; (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.cleanup { - int ThreeDS2ServiceInstance; (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.getSDKVersion { - int initialize; int getWarnings; char ThreeDS2ServiceInstance; char get; (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ConfigParameters { - int initialize; char ThreeDS2Service; (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.onCompleted { - int ThreeDS2Service; int getWarnings; (); - char[] ThreeDS2ServiceInstance(long,char[],int); -} - --keep class com.netcetera.threeds.sdk.infrastructure.addParam { - int get; int ThreeDS2ServiceInstance; (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.onError { - int ThreeDS2Service; int getWarnings; (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.getParamValue { - int ThreeDS2ServiceInstance; char get; char ThreeDS2Service; int initialize; int getWarnings; int createTransaction; int getSDKVersion; (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ConfigurationBuilder { - int initialize; (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.removeParam { - int get(java.lang.Object); - int ThreeDS2ServiceInstance(int); -} - --keep class com.netcetera.threeds.sdk.infrastructure.CertificateInfoCertificateType { - java.lang.Integer initialize;} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.CertificateInfoCertificateType { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.ThreeDS2ServiceInstance { - (); -} - --keep class com.netcetera.threeds.sdk.api.ThreeDS2Service { - void initialize(android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,com.netcetera.threeds.sdk.api.ui.logic.UiCustomization); - void initialize(android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,java.util.Map); - void initialize(android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,java.util.Map,com.netcetera.threeds.sdk.api.ThreeDS2Service$InitializationCallback); - java.util.List getWarnings(); - java.lang.String getSDKVersion(); - com.netcetera.threeds.sdk.api.info.SDKInfo getSDKInfo(); - void cleanup(android.content.Context); - com.netcetera.threeds.sdk.api.transaction.Transaction createTransaction(java.lang.String,java.lang.String); -} - --keep class com.netcetera.threeds.sdk.api.ThreeDS2Service$InitializationCallback { - void onCompleted(); - void onError(java.lang.Throwable); -} - --keep class com.netcetera.threeds.sdk.api.configparameters.ConfigParameters { - java.lang.String getParamValue(java.lang.String,java.lang.String); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.api.configparameters.builder.ConfigurationBuilder { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.api.configparameters.builder.SchemeConfiguration$Builder { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.api.exceptions.InvalidInputException --keep class com.netcetera.threeds.sdk.api.exceptions.SDKAlreadyInitializedException - --keep class com.netcetera.threeds.sdk.api.exceptions.SDKNotInitializedException - --keep class com.netcetera.threeds.sdk.api.exceptions.SDKRuntimeException - --keep class com.netcetera.threeds.sdk.api.info.CertificateInfo - --keep class com.netcetera.threeds.sdk.api.info.CertificateInfo$CertificateType { - com.netcetera.threeds.sdk.api.info.CertificateInfo$CertificateType CERTIFICATE; com.netcetera.threeds.sdk.api.info.CertificateInfo$CertificateType PUBLIC_KEY;} - --keep class com.netcetera.threeds.sdk.api.info.SDKInfo - --keep class com.netcetera.threeds.sdk.api.security.Severity { - com.netcetera.threeds.sdk.api.security.Severity MEDIUM; com.netcetera.threeds.sdk.api.security.Severity HIGH;} - --keep class com.netcetera.threeds.sdk.api.security.Warning { - (java.lang.String,java.lang.String,com.netcetera.threeds.sdk.api.security.Severity); -} - --keep class com.netcetera.threeds.sdk.api.transaction.AuthenticationRequestParameters { - (java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String); -} - --keep class com.netcetera.threeds.sdk.api.transaction.Transaction { - com.netcetera.threeds.sdk.api.transaction.AuthenticationRequestParameters getAuthenticationRequestParameters(); - void doChallenge(android.app.Activity,com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeParameters,com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver,int); - void useBridgingExtension(com.netcetera.threeds.sdk.api.transaction.Transaction$BridgingMessageExtensionVersion); - com.netcetera.threeds.sdk.api.ui.ProgressView getProgressView(android.app.Activity); - void close(); -} - --keep class com.netcetera.threeds.sdk.api.transaction.Transaction$BridgingMessageExtensionVersion - --keep class com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeParameters { - java.lang.String get3DSServerTransactionID(); - java.lang.String getAcsTransactionID(); - java.lang.String getAcsRefNumber(); - java.lang.String getAcsSignedContent(); -} - --keep class com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver { - void completed(com.netcetera.threeds.sdk.api.transaction.challenge.events.CompletionEvent); - void cancelled(); - void timedout(); - void protocolError(com.netcetera.threeds.sdk.api.transaction.challenge.events.ProtocolErrorEvent); - void runtimeError(com.netcetera.threeds.sdk.api.transaction.challenge.events.RuntimeErrorEvent); -} - --keep class com.netcetera.threeds.sdk.api.transaction.challenge.ErrorMessage { - java.lang.String getErrorCode(); - java.lang.String getErrorDescription(); - java.lang.String getErrorDetails(); - java.lang.String getErrorComponent(); -} - --keep class com.netcetera.threeds.sdk.api.transaction.challenge.events.CompletionEvent { - java.lang.String getTransactionStatus(); -} - --keep class com.netcetera.threeds.sdk.api.transaction.challenge.events.ProtocolErrorEvent { - com.netcetera.threeds.sdk.api.transaction.challenge.ErrorMessage getErrorMessage(); -} - --keep class com.netcetera.threeds.sdk.api.transaction.challenge.events.RuntimeErrorEvent { - java.lang.String getErrorCode(); - java.lang.String getErrorMessage(); -} - --keep class com.netcetera.threeds.sdk.api.ui.ProgressView - --keep class com.netcetera.threeds.sdk.api.ui.logic.UiCustomization - --keep class com.netcetera.threeds.sdk.api.ui.logic.UiCustomization$UiCustomizationType - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.api.utils.DsRidValues { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getCertPrefix { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.values { - (com.netcetera.threeds.sdk.infrastructure.values$ThreeDS2ServiceInstance); -} - --keep class com.netcetera.threeds.sdk.infrastructure.values$ThreeDS2ServiceInstance { - com.netcetera.threeds.sdk.infrastructure.values$ThreeDS2ServiceInstance ThreeDS2ServiceInstance(android.content.Context); -} - --keep class com.netcetera.threeds.sdk.infrastructure.close { - void initialize(com.netcetera.threeds.sdk.infrastructure.setAcsTransactionID); - void ThreeDS2Service(java.lang.Class); - java.lang.Object get(java.lang.Class); +# Fonctions Kotlin de niveau package (fichiers .kt) +-keep public class com.monext.sdk.PaymentBoxKt { + public *; } - --keep class com.netcetera.threeds.sdk.infrastructure.setAcsTransactionID - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setAcsSignedContent { - (); +-keep public class com.monext.sdk.PaymentSheetKt { + public *; } - --keep class com.netcetera.threeds.sdk.infrastructure.completed { - java.security.PublicKey getWarnings(java.lang.String); - com.netcetera.threeds.sdk.api.info.CertificateInfo$CertificateType ThreeDS2ServiceInstance(java.lang.String); +-keep public class com.monext.sdk.MnxtSDKContextKt { + public *; } --keep class com.netcetera.threeds.sdk.infrastructure.getErrorComponent { - (com.netcetera.threeds.sdk.infrastructure.getErrorMessage,java.util.List,com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service); +# Classes de configuration +-keep public class com.monext.sdk.Appearance { + *; } - --keep class com.netcetera.threeds.sdk.infrastructure.getTransactionStatus { - java.lang.String ThreeDS2Service(java.lang.String); +-keep public enum com.monext.sdk.Appearance$PaymentMethodShape { + *; } - --keep class com.netcetera.threeds.sdk.infrastructure.getMessageVersionNumber { - com.netcetera.threeds.sdk.infrastructure.getTransactionStatus ThreeDS2Service(java.lang.String,java.lang.String,java.lang.String,com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings); +# Toutes les autres classes imbriquées (Defaults, Colors, etc.) +-keep class com.monext.sdk.Appearance$** { + *; } - --keep class com.netcetera.threeds.sdk.infrastructure.showProgress { - java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.getErrorComponent); +-keep public class com.monext.sdk.GooglePayConfiguration { + public *; } - --keep class com.netcetera.threeds.sdk.infrastructure.getErrorMessage - --keep class com.netcetera.threeds.sdk.infrastructure.ProgressView { - void get(com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.util.Locale); - void getWarnings(com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings,com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service,java.lang.String); - com.netcetera.threeds.sdk.infrastructure.getErrorMessage get(); +-keep public class com.monext.sdk.MnxtSDKConfiguration { + public *; } - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ProtocolErrorEvent { - void ThreeDS2ServiceInitializationCallback(); - void init$0(); +-keep public class com.monext.sdk.MnxtSDKContext { + public *; } --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ProtocolErrorEvent$ThreeDS2Service { - void initialize(); +# Sealed classes - Garder la classe parent ET tous les héritiers +-keep public class com.monext.sdk.MnxtEnvironment { + public *; } - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hideProgress { - void initialize(); - void init$0(); +-keep public class com.monext.sdk.MnxtEnvironment$Sandbox { + *; } - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCornerRadius { - void init$0(); +-keep public class com.monext.sdk.MnxtEnvironment$Production { + *; } - --keep class com.netcetera.threeds.sdk.infrastructure.setDarkTextColor { - java.lang.Object[] initialize(int,int); +-keep public class com.monext.sdk.MnxtEnvironment$Custom { + *; } --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setDarkTextColor { - void init$0(); - void init$1(); +-keep public class com.monext.sdk.PaymentResult { + public *; } - --keep class com.netcetera.threeds.sdk.infrastructure.setScrollContainer { - java.lang.Object[] getWarnings(android.content.Context,int,int); +-keep public class com.monext.sdk.PaymentResult$* { + *; } --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScrollContainer { - void init$0(); - void init$1(); -} +# Companion objects des classes publiques +-keep class com.monext.sdk.Appearance$Companion { *; } +-keep class com.monext.sdk.GooglePayConfiguration$Companion { *; } +-keep class com.monext.sdk.MnxtSDKConfiguration$Companion { *; } +-keep class com.monext.sdk.MnxtSDKContext$Companion { *; } +-keep class com.monext.sdk.MnxtEnvironment$Companion { *; } +-keep class com.monext.sdk.PaymentResult$Companion { *; } --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setStateListAnimator { - (); +# Enums publics +-keepclassmembers public enum com.monext.sdk.** { + public static **[] values(); + public static ** valueOf(java.lang.String); + **[] $VALUES; + public *; } --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setStateListAnimator { - void ThreeDS2ServiceInstance(); - void init$0(); -} +# ============================================ +# PACKAGE INTERNAL - OBFUSQUER +# ============================================ +-keep,allowobfuscation,allowshrinking class com.monext.sdk.internal.** { *; } --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLayoutParams { - (); -} +# ============================================ +# KOTLIN ESSENTIALS +# ============================================ +-keepattributes Signature +-keepattributes *Annotation* +-keepattributes InnerClasses +-keepattributes EnclosingMethod --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLayoutParams { - void initialize(); -} +# Metadata Kotlin +-keep class kotlin.Metadata { *; } --keep class com.netcetera.threeds.sdk.infrastructure.setScrollBarSize { - com.netcetera.threeds.sdk.infrastructure.setScrollbarFadingEnabled cleanup(); - java.lang.Object ThreeDS2Service(java.lang.Object[],int,int,int); +# WhenMappings (générés par le compilateur) +-keepclassmembers class **$WhenMappings { + ; } --keep class com.netcetera.threeds.sdk.infrastructure.setScrollbarFadingEnabled { - com.netcetera.threeds.sdk.infrastructure.setScrollbarFadingEnabled$ThreeDS2ServiceInstance ThreeDS2Service(); - java.lang.Object get(java.lang.Object[],int,int,int); +# Data classes +-keepclassmembers class com.monext.sdk.** { + public ** component*(); + public ** copy(...); } --keep class com.netcetera.threeds.sdk.infrastructure.setScrollbarFadingEnabled$ThreeDS2ServiceInstance { - java.lang.String ThreeDS2ServiceInstance(); - java.lang.String getWarnings(); -} +# ============================================ +# KOTLINX SERIALIZATION +# ============================================ +-keepattributes RuntimeVisibleAnnotations,RuntimeVisibleParameterAnnotations --keep class com.netcetera.threeds.sdk.infrastructure.setLayerPaint { - java.lang.Object get(java.lang.Object[],int,int,int); +-keepclassmembers @kotlinx.serialization.Serializable class ** { + *** Companion; + *** INSTANCE; + kotlinx.serialization.KSerializer serializer(...); } --keep class com.netcetera.threeds.sdk.infrastructure.setLayerType { - java.lang.Object getWarnings(java.lang.Object[],int,int,int); -} +-keep class **$$serializer { *; } +-keep @kotlinx.serialization.Serializable class * { *; } --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLayerType$get { - void getWarnings(); +# ============================================ +# JETPACK COMPOSE +# ============================================ +-keep class androidx.compose.runtime.** { *; } +-keep @androidx.compose.runtime.Composable class * { *; } +-keepclassmembers class * { + @androidx.compose.runtime.Composable *; } --keep class com.netcetera.threeds.sdk.infrastructure.setRenderEffect { - java.lang.Object ThreeDS2ServiceInstance(java.lang.Object[],int,int,int); +# ============================================ +# COROUTINES +# ============================================ +-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} +-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} +-keepclassmembers class kotlinx.coroutines.** { + volatile ; } --keep class com.netcetera.threeds.sdk.infrastructure.setDrawingCacheEnabled { - java.lang.Object getWarnings(java.lang.Object[],int,int,int); -} +# ============================================ +# GOOGLE PAY +# ============================================ +-keep class com.google.android.gms.wallet.** { *; } +-keep class com.google.android.gms.common.** { *; } +-keep class com.google.android.gms.tasks.** { *; } --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setBackgroundDrawable { - (); -} +# Google Pay Button (bibliothèque pay-button) +-keep class com.google.pay.button.** { *; } +-keep enum com.google.pay.button.ButtonTheme { *; } +-keep enum com.google.pay.button.ButtonType { *; } +-keep public class com.google.pay.button.** { *; } +-keep public enum com.google.pay.button.ButtonTheme { *; } +-keep public enum com.google.pay.button.ButtonType { *; } --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setForegroundTintBlendMode { - void ThreeDS2Service(); - void init$0(); -} --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setForegroundGravity { - (); -} +# ============================================ +# NETCETERA 3DS SDK +# ============================================ +-keeppackagenames com.netcetera.threeds.sdk.api.** --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setForegroundTintList { - (); +-keep public class com.netcetera.threeds.sdk.** { + public protected ; + public protected ; } --keep class com.netcetera.threeds.sdk.infrastructure.setForegroundTintMode { - void initialize(long,long); +-keep,allowshrinking class com.netcetera.threeds.sdk.** { + ; + ; } --keep class com.netcetera.threeds.sdk.infrastructure.setPadding { - com.netcetera.threeds.sdk.infrastructure.setScrollBarSize ThreeDS2ServiceInstance(java.lang.String); - java.util.List initialize(); +-keep class org.bouncycastle.** { + ; + ; } --keep class com.netcetera.threeds.sdk.infrastructure.setActivated { - com.netcetera.threeds.sdk.infrastructure.setPadding ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.api.configparameters.ConfigParameters); +-keep,allowshrinking class org.bouncycastle.** { + ; + ; } --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setAnimation { - void init$0(); +-keep class org.slf4j.** { + ; + ; } --keep class com.netcetera.threeds.sdk.infrastructure.setMinimumHeight { - void initialize(long,long); +-keep class kotlin.KotlinVersion { + ; + ; } --keep class com.netcetera.threeds.sdk.infrastructure.setOverScrollMode { - com.netcetera.threeds.sdk.infrastructure.completed initialize(); -} +# ============================================ +# PARCELIZE +# ============================================ +-keep @kotlinx.parcelize.Parcelize class * { *; } --keep class com.netcetera.threeds.sdk.infrastructure.setTextAlignment { - com.netcetera.threeds.sdk.infrastructure.setTextAlignment ThreeDS2ServiceInitializationCallback; com.netcetera.threeds.sdk.infrastructure.setTextAlignment cleanup; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getParamValue; com.netcetera.threeds.sdk.infrastructure.setTextAlignment onCompleted; com.netcetera.threeds.sdk.infrastructure.setTextAlignment ConfigParameters; com.netcetera.threeds.sdk.infrastructure.setTextAlignment addParam; com.netcetera.threeds.sdk.infrastructure.setTextAlignment build; com.netcetera.threeds.sdk.infrastructure.setTextAlignment mastercardSchemeConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment amexConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SchemeConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment dinersSchemeConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment eftposConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment cbConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemeLogoDark; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemeId; com.netcetera.threeds.sdk.infrastructure.setTextAlignment newSchemeConfiguration; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemeName; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemeEncryptionPublicKeyId; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SchemeConfigurationBuilder; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getSchemePublicRootKeys; com.netcetera.threeds.sdk.infrastructure.setTextAlignment logo; com.netcetera.threeds.sdk.infrastructure.setTextAlignment encryptionPublicKey; com.netcetera.threeds.sdk.infrastructure.setTextAlignment rootPublicKey; com.netcetera.threeds.sdk.infrastructure.setTextAlignment logoDark; com.netcetera.threeds.sdk.infrastructure.setTextAlignment encryptionPublicKeyFromAssetCertificate; com.netcetera.threeds.sdk.infrastructure.setTextAlignment rootPublicKeyFromAssetCertificate; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SDKNotInitializedException; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SDKAlreadyInitializedException; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SDKRuntimeException; com.netcetera.threeds.sdk.infrastructure.setTextAlignment toString; com.netcetera.threeds.sdk.infrastructure.setTextAlignment CertificateInfo; com.netcetera.threeds.sdk.infrastructure.setTextAlignment values; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getCertPrefix; com.netcetera.threeds.sdk.infrastructure.setTextAlignment SDKInfo; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getEncryptionCertificate; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getEncryptionCertificateKid; com.netcetera.threeds.sdk.infrastructure.setTextAlignment Warning; com.netcetera.threeds.sdk.infrastructure.setTextAlignment AuthenticationRequestParameters; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getDeviceData; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getMessageVersion; com.netcetera.threeds.sdk.infrastructure.setTextAlignment ChallengeParameters; com.netcetera.threeds.sdk.infrastructure.setTextAlignment TransactionBridgingMessageExtensionVersion; com.netcetera.threeds.sdk.infrastructure.setTextAlignment getValue; com.netcetera.threeds.sdk.infrastructure.setTextAlignment setAcsTransactionID; com.netcetera.threeds.sdk.infrastructure.setTextAlignment setAcsSignedContent; com.netcetera.threeds.sdk.infrastructure.setTextAlignment setAcsRefNumber; com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener get(java.lang.Object[]); -} +# ============================================ +# DEBUGGING +# ============================================ +-keepattributes SourceFile,LineNumberTable +-renamesourcefileattribute SourceFile --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTextAlignment { - void ThreeDS2Service(); - void init$0(); -} +# ============================================ +# OPTIMISATIONS +# ============================================ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTextDirection { - void get(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled { - void getWarnings(com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$ThreeDS2ServiceInstance); - void getWarnings(com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$ThreeDS2ServiceInstance,java.lang.Runnable); - java.lang.Object ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$initialize); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$initialize - --keep class com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled$ThreeDS2ServiceInstance - --keep class com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener { - com.netcetera.threeds.sdk.infrastructure.setTextAlignment ThreeDS2ServiceInstance(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setScrollCaptureHint { - int initialize; (com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver); - void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.api.transaction.challenge.events.CompletionEvent); - void ThreeDS2Service(); - void getWarnings(); - void getWarnings(com.netcetera.threeds.sdk.api.transaction.challenge.events.ProtocolErrorEvent); - void initialize(com.netcetera.threeds.sdk.api.transaction.challenge.events.RuntimeErrorEvent); - void (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setClipChildren { - com.netcetera.threeds.sdk.infrastructure.setNestedScrollingEnabled get(com.netcetera.threeds.sdk.infrastructure.setBreakStrategy); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setClipChildren { - void get(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMotionEventSplittingEnabled { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMotionEventSplittingEnabled { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTransitionGroup { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setClipToPadding { - java.lang.Object[] getWarnings(android.content.Context,int,int,int); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setClipToPadding { - void init$0(); - void init$1(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setLayoutAnimation { - void get(java.util.Date); - com.netcetera.threeds.sdk.api.info.SDKInfo getWarnings(java.util.List); - void initialize(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setOnHierarchyChangeListener { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLayoutTransition { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setLayoutMode { - java.util.Locale getWarnings(java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setPersistentDrawingCache { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setPersistentDrawingCache { - void get(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setLayoutAnimationListener { - void initialize(com.netcetera.threeds.sdk.infrastructure.setLines,com.netcetera.threeds.sdk.infrastructure.setAddStatesFromChildren); - void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setAllCaps,com.netcetera.threeds.sdk.infrastructure.setHorizontalScrollbarOverlay); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setAddStatesFromChildren { - void getWarnings(com.netcetera.threeds.sdk.infrastructure.setFilters); - void get(com.netcetera.threeds.sdk.infrastructure.setExtractedText); - void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setAllCaps); - void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); - void getWarnings(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setHorizontalScrollbarOverlay { - void getWarnings(); - void initialize(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setHttpAuthUsernamePassword { - java.lang.String get(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setVerticalScrollbarOverlay { - com.netcetera.threeds.sdk.infrastructure.setFindListener initialize(); - com.netcetera.threeds.sdk.infrastructure.setVerticalScrollbarOverlay ThreeDS2Service(); - com.netcetera.threeds.sdk.infrastructure.setNetworkAvailable getWarnings(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setNetworkAvailable - --keep class com.netcetera.threeds.sdk.infrastructure.setFindListener { - com.netcetera.threeds.sdk.infrastructure.setHttpAuthUsernamePassword ThreeDS2ServiceInstance(); - boolean initialize(); - int ThreeDS2Service(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setWebViewClient { - com.netcetera.threeds.sdk.infrastructure.setVerticalScrollbarOverlay ThreeDS2Service(java.lang.String,java.lang.String,java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setVerticalScrollbarOverlay getWarnings(java.lang.String,java.lang.String,java.lang.String,java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setSafeBrowsingWhitelist { - com.netcetera.threeds.sdk.infrastructure.setWebViewClient ThreeDS2ServiceInstance(); - com.netcetera.threeds.sdk.infrastructure.setWebViewClient get(java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setPictureListener { - (javax.net.ssl.SSLSocketFactory,java.lang.String); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setPictureListener { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setWebContentsDebuggingEnabled { - java.lang.Object initialize(java.lang.Object[],int,int,int); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setDataDirectorySuffix { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setItemChecked { - java.lang.Integer ThreeDS2Service; java.lang.Integer getWarnings; java.lang.Integer get; android.util.Range initialize;} - --keep class com.netcetera.threeds.sdk.infrastructure.setAdapter { - (); - boolean getWarnings(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); - java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.setFindListener); - boolean initialize(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setFastScrollStyle { - com.netcetera.threeds.sdk.infrastructure.setLayoutAnimationListener ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setLayoutAnimationListener); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setFastScrollStyle { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMultiChoiceModeListener { - java.lang.Object[] get$22d121da(int,int,java.lang.Object,int); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMultiChoiceModeListener { - void init$0(); - void init$1(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSelector { - void initialize(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setFriction { - com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings get(); - com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings ThreeDS2ServiceInstance(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service ThreeDS2ServiceInstance(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setFriction$ThreeDS2Service { - void getWarnings(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings { - com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings ThreeDS2ServiceInstance; com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings ThreeDS2Service; java.lang.String ThreeDS2ServiceInstance(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings { - void getWarnings(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setRemoteViewsAdapter { - java.lang.String get(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setEdgeEffectColor { - java.lang.String initialize(); - java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings); - java.lang.String getWarnings(); - java.lang.String ThreeDS2ServiceInstance(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setVelocityScale { - (); - java.lang.String ThreeDS2ServiceInstance(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setTopEdgeEffectColor { - com.netcetera.threeds.sdk.infrastructure.setTopEdgeEffectColor ThreeDS2ServiceInstance;} - --keep class com.netcetera.threeds.sdk.infrastructure.setOnGroupCollapseListener { - (boolean); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setScaleType { - (java.lang.Object); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setBaselineY10307$5 { - int[] get;} - --keep class com.netcetera.threeds.sdk.infrastructure.setImageMatrix { - com.netcetera.threeds.sdk.infrastructure.setImageMatrix ThreeDS2Service(java.lang.String); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setImageMatrix { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setBaselineAlignBottom { - java.lang.String ThreeDS2ServiceInstance(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCropToPadding { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setDividerPadding { - com.netcetera.threeds.sdk.infrastructure.setDividerPadding ThreeDS2ServiceInstance(android.content.Context); - java.lang.String get(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setDividerPadding { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setShowDividers { - void getWarnings(com.netcetera.threeds.sdk.infrastructure.setDividerHeight); - com.netcetera.threeds.sdk.infrastructure.setDividerHeight get(); - void ThreeDS2ServiceInstance(); - java.lang.Long getWarnings(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setOrientation { - java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.setVerticalGravity); - java.lang.String ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setDividerHeight); - com.netcetera.threeds.sdk.infrastructure.setDividerHeight getWarnings(java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setBaselineAlignedChildIndex { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setBaselineAlignedChildIndex { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setWeightSum { - java.lang.String ThreeDS2Service(); - void get(com.netcetera.threeds.sdk.infrastructure.setFooterDividersEnabled); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMeasureWithLargestChildEnabled { - void ThreeDS2ServiceInstance(java.lang.String); - boolean get(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setItemsCanFocus { - void getWarnings(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setGravity - --keep class com.netcetera.threeds.sdk.infrastructure.setGravity$initialize { - (); - com.netcetera.threeds.sdk.infrastructure.setGravity$initialize get(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setGravity$initialize ThreeDS2Service(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setGravity ThreeDS2Service(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setVerticalGravity - --keep class com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize { - (); - com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize ThreeDS2ServiceInstance(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize getWarnings(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize get(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize initialize(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize get(com.netcetera.threeds.sdk.infrastructure.setGravity); - com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize ThreeDS2Service(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setVerticalGravity$initialize ThreeDS2ServiceInitializationCallback(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setVerticalGravity get(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setHorizontalGravity { - java.lang.String get(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setDividerHeight { - com.netcetera.threeds.sdk.infrastructure.setFooterDividersEnabled get(); - com.netcetera.threeds.sdk.infrastructure.setHorizontalGravity initialize(); - java.lang.String ThreeDS2ServiceInstance(); - java.lang.Boolean ThreeDS2Service(); - java.lang.Object getWarnings(java.lang.Object[],int,int,int); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setFooterDividersEnabled - --keep class com.netcetera.threeds.sdk.infrastructure.setOverscrollHeader { - void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setEdgeEffectColor,java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setDivider { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinWidth { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMinHeight { - java.text.DateFormat initialize;} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinHeight { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinHeight { - void getWarnings(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service { - com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service ThreeDS2ServiceInstance; com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service initialize; com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service ThreeDS2Service; com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service get; java.lang.String get(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinHeight$ThreeDS2Service { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgressDrawable { - void getWarnings(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintList { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintList { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode - --keep class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize { - (java.lang.String,java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize getWarnings(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize ThreeDS2ServiceInstance(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize get(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize initialize(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize getSDKVersion(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize getSDKInfo(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize cleanup(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize ThreeDS2ServiceInitializationCallback(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize createTransaction(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize onCompleted(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize ConfigParameters(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize onError(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize addParam(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode ThreeDS2ServiceInstance(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setProgressTintList { - void ThreeDS2Service(); - void initialize(com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode); - void get(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgressBackgroundTintMode { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgressTintBlendMode { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgressDrawableTiled { - void getWarnings(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setProgressBackgroundTintBlendMode { - void ThreeDS2Service(java.util.List); - java.util.List ThreeDS2ServiceInstance(); - void initialize(java.util.List); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setSecondaryProgressTintBlendMode { - java.lang.String get(java.util.List); - java.lang.String ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setMin); - java.util.List get(java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setProgress { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setProgress { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMax - --keep class com.netcetera.threeds.sdk.infrastructure.setMax$get { - (); - com.netcetera.threeds.sdk.infrastructure.setMax$get ThreeDS2Service(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setMax$get initialize(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setMax$get get(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setMax$get ThreeDS2ServiceInstance(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setMax$get getWarnings(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setMax$get getSDKVersion(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setMax initialize(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMin { - java.util.List get(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMin$ThreeDS2Service { - (java.lang.String,java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setMin$ThreeDS2Service initialize(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.setMin$ThreeDS2Service getWarnings(com.netcetera.threeds.sdk.infrastructure.setMax); - com.netcetera.threeds.sdk.infrastructure.setMin$ThreeDS2Service ThreeDS2Service(java.util.List); - com.netcetera.threeds.sdk.infrastructure.setMin initialize(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setSecondaryProgress { - void getWarnings(com.netcetera.threeds.sdk.infrastructure.setEdgeEffectColor,java.lang.String); - void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setEdgeEffectColor,java.lang.String,java.lang.String,java.lang.String,java.lang.String); - void ThreeDS2Service(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setInterpolator { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setAutoSizeTextTypeWithDefaults { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMovementMethod - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMovementMethod { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setTypeface { - (com.netcetera.threeds.sdk.api.ThreeDS2Service,android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,com.netcetera.threeds.sdk.api.ui.logic.UiCustomization); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setTransformationMethod { - (com.netcetera.threeds.sdk.api.ThreeDS2Service,android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,java.util.Map); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setKeyListener { - (com.netcetera.threeds.sdk.api.ThreeDS2Service,android.content.Context,com.netcetera.threeds.sdk.api.configparameters.ConfigParameters,java.lang.String,java.util.Map,com.netcetera.threeds.sdk.api.ThreeDS2Service$InitializationCallback); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawablesRelative { - (com.netcetera.threeds.sdk.api.ThreeDS2Service); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawablePadding { - (com.netcetera.threeds.sdk.api.ThreeDS2Service); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawablesWithIntrinsicBounds { - (com.netcetera.threeds.sdk.api.ThreeDS2Service); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawableTintList { - (com.netcetera.threeds.sdk.api.ThreeDS2Service,android.content.Context); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setCompoundDrawablesRelativeWithIntrinsicBounds { - (com.netcetera.threeds.sdk.api.ThreeDS2Service,java.lang.String,java.lang.String); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTextSelectHandleLeft { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setTextCursorDrawable { - com.netcetera.threeds.sdk.api.ThreeDS2Service get(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTextCursorDrawable { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setTextLocales - --keep class com.netcetera.threeds.sdk.infrastructure.setTextSize { - java.lang.String ThreeDS2Service(java.security.KeyPair); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLocalePreferredLineHeightForMinimumUsed { - void get(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLetterSpacing { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setShiftDrawingOffsetForStartOverhang { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMinimumFontMetrics { - void get(); - void initialize(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setTextMetricsParams - --keep class com.netcetera.threeds.sdk.infrastructure.setHyphenationFrequency { - java.lang.String getWarnings(); - java.lang.String get(); - java.security.PublicKey ThreeDS2Service(); - java.security.KeyPair initialize(); - java.lang.String cleanup(); - void ThreeDS2ServiceInitializationCallback(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setBreakStrategy { - void get(com.netcetera.threeds.sdk.infrastructure.setExtractedText); - void ThreeDS2Service(); - void ThreeDS2ServiceInstance(); - void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setAllCaps); - void initialize(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLineBreakWordStyle { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setFontFeatureSettings { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setShadowLayer { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHighlightColor { - void initialize(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setPaintFlags { - com.netcetera.threeds.sdk.infrastructure.setMinimumFontMetrics initialize(com.netcetera.threeds.sdk.infrastructure.setTextMetricsParams); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setAutoLinkMask { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLinksClickable { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHintTextColor { - void getWarnings(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setLinkTextColor { - java.lang.String ThreeDS2Service(java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setHeight { - java.lang.String ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setLines); - java.lang.String getWarnings(com.netcetera.threeds.sdk.infrastructure.setAllCaps); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setLines { - com.netcetera.threeds.sdk.infrastructure.getClass get(); - java.lang.String getWarnings(); - java.lang.String ThreeDS2Service(); - java.lang.String cleanup(); - com.netcetera.threeds.sdk.infrastructure.getVersion createTransaction(); - com.netcetera.threeds.sdk.infrastructure.addSuppressed getSDKInfo(); - java.lang.String ConfigParameters(); - com.netcetera.threeds.sdk.infrastructure.clear apiKey(); - java.lang.Boolean configureScheme(); - com.netcetera.threeds.sdk.infrastructure.notify visaSchemeConfiguration(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLines { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setHorizontallyScrolling - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHorizontallyScrolling { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHorizontallyScrolling { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMaxLines { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMaxLines { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinLines { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMinLines { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setEms { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setEms { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setWidth { - java.lang.String ThreeDS2ServiceInstance(java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setFocusedSearchResultIndex { - void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setFilters); - void get(com.netcetera.threeds.sdk.infrastructure.setExtractedText); - void ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setAllCaps); - void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setHighlights { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSearchResultHighlights { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLineHeight { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setFilters - --keep class com.netcetera.threeds.sdk.infrastructure.setExtractedText - --keep class com.netcetera.threeds.sdk.infrastructure.setAllCaps - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller { - void getSDKInfo(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller$ThreeDS2Service { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller$ThreeDS2Service { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setScroller$ThreeDS2ServiceInstance { - void initialize(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCursorVisible { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTitleMarginStart { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setLogoDescription { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSubtitleTextAppearance$ThreeDS2ServiceInstance { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTitleTextAppearance { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSubtitle { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTitle { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setTitleTextColor { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapseContentDescription { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapseContentDescription { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setSubtitleTextColor { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setNavigationOnClickListener { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setNavigationOnClickListener { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setNavigationContentDescription { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setNavigationContentDescription { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setContentInsetsAbsolute { - (java.lang.Runnable); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setContentInsetsRelative { - void initialize(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setCollapseIcon { - com.netcetera.threeds.sdk.infrastructure.setCollapseIcon ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.infrastructure.setHyphenationFrequency,com.netcetera.threeds.sdk.infrastructure.fy,com.netcetera.threeds.sdk.infrastructure.setWidth,com.netcetera.threeds.sdk.infrastructure.nc,com.netcetera.threeds.sdk.infrastructure.iz,com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize); - void ThreeDS2Service(java.lang.String,com.netcetera.threeds.sdk.infrastructure.setFocusedSearchResultIndex); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapseIcon { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setContentInsetStartWithNavigation { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapsible { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setCollapsible { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.findFragmentByTag { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.findFragmentById { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.setMenuCallbacks { - java.lang.Object[] ThreeDS2Service(android.content.Context,int,int); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setMenuCallbacks { - void init$0(); - void init$1(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.computeValue { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getView { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$4 { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$2 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$2 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$1 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$1 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$3 { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.equals$5 { - void getWarnings(long,long); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$5 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.equals$8 { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.clone { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$3 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$3 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$4 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$1 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$5 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$2 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$6 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$8 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$9 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$9 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$7 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$7 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$10 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$13 { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$12 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$12 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$20 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$18 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$16 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$16 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$19 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$25 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.hashCode$23 { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.finalize { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.finalize { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.finalize$getWarnings { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.finalize$getWarnings { - void initialize(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.compareTo { - void initialize(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.notify - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.notify { - void ThreeDS2Service(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.getClass { - com.netcetera.threeds.sdk.infrastructure.getClass get;} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getClass { - void initialize(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getDeclaringClass { - void get(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getCause { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getLocalizedMessage { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.wait { - void ThreeDS2Service(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.notifyAll { - void initialize(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.initCause { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.printStackTrace { - void initialize(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.addSuppressed - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.addSuppressed { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.setStackTrace { - void initialize(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.fillInStackTrace { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getStackTrace { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getSuppressed { - void initialize(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.getVersion { - com.netcetera.threeds.sdk.infrastructure.getVersion initialize;} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getVersion { - void get(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.load { - void initialize(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.clear - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.clear { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getInfo { - void initialize(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.putAll { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.entrySet { - void ThreeDS2Service(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.remove - --keep class com.netcetera.threeds.sdk.infrastructure.replaceAll { - void initialize(); - void get(com.netcetera.threeds.sdk.infrastructure.setFilters); - void get(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.computeIfAbsent - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.keys$initialize { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.getServices$get { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.contains { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.contains$ThreeDS2Service { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.containsKey { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.save { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.stringPropertyNames { - void initialize(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.aa { - void getWarnings(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ab { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ae { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ag { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ag { - void get(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.af { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.al { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ai { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ai$getWarnings { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ak { - void initialize(long,long); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ap { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ap$getWarnings { - void initialize(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.am { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.am { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.av { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ba { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ay { - void getSDKInfo(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.aw { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bb { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bb$1 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bb$1 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bd$ThreeDS2ServiceInstance { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bi { - void ThreeDS2Service(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bi$5 { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bi$5 { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bk { - void ThreeDS2ServiceInstance(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bn { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bm { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bp { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bp { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bo { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bq { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bt { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bu { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.bv { - void initialize(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.cd { - void ThreeDS2ServiceInitializationCallback(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ca { - com.netcetera.threeds.sdk.infrastructure.replaceAll initialize(com.netcetera.threeds.sdk.infrastructure.computeIfAbsent); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ce { - void init$0(); - void init$1(); - void init$2(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.cq { - void getWarnings(long,long); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.cp { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ct { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.di { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ds { - java.lang.Object[] get(android.content.Context,int,int); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ds { - void init$0(); - void init$1(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.dt { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.dy { - void ThreeDS2ServiceInstance(long,long); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.en { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.et { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.et$initialize { - void initialize(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.et$ThreeDS2Service { - void get(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.et$getWarnings { - void getWarnings(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ev { - void get(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.fa { - (com.netcetera.threeds.sdk.api.transaction.Transaction); -} - --keep class com.netcetera.threeds.sdk.infrastructure.fb { - (com.netcetera.threeds.sdk.api.transaction.Transaction,android.app.Activity,com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeParameters,com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver,int); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ex { - (com.netcetera.threeds.sdk.api.transaction.Transaction,com.netcetera.threeds.sdk.api.transaction.Transaction$BridgingMessageExtensionVersion); -} - --keep class com.netcetera.threeds.sdk.infrastructure.fe { - (com.netcetera.threeds.sdk.api.transaction.Transaction,android.app.Activity); -} - --keep class com.netcetera.threeds.sdk.infrastructure.fd { - (com.netcetera.threeds.sdk.api.transaction.Transaction); -} - --keep class com.netcetera.threeds.sdk.infrastructure.fh { - com.netcetera.threeds.sdk.infrastructure.setHorizontallyScrolling get(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.fy - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ga { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ii { - boolean ThreeDS2ServiceInstance(); - void getWarnings(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ii { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ig { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ie { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ij { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales); -} - --keep class com.netcetera.threeds.sdk.infrastructure.in { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.remove); -} - --keep class com.netcetera.threeds.sdk.infrastructure.im { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setFilters); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ik { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setExtractedText); -} - --keep class com.netcetera.threeds.sdk.infrastructure.il { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setAllCaps); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ip { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ir { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); -} - --keep class com.netcetera.threeds.sdk.infrastructure.is { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales,com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); -} - --keep class com.netcetera.threeds.sdk.infrastructure.iq { - (com.netcetera.threeds.sdk.infrastructure.setTextLocales); -} - --keep class com.netcetera.threeds.sdk.infrastructure.io { - com.netcetera.threeds.sdk.infrastructure.setLines initialize(); - com.netcetera.threeds.sdk.infrastructure.setLines ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.remove); - com.netcetera.threeds.sdk.infrastructure.setAllCaps get(com.netcetera.threeds.sdk.infrastructure.setOnCapturedPointerListener); -} - --keep class com.netcetera.threeds.sdk.infrastructure.it { - com.netcetera.threeds.sdk.infrastructure.setHorizontalScrollbarOverlay initialize(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.it { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.iv { - com.netcetera.threeds.sdk.api.transaction.Transaction get(com.netcetera.threeds.sdk.infrastructure.getErrorComponent,com.netcetera.threeds.sdk.infrastructure.getTransactionStatus,com.netcetera.threeds.sdk.infrastructure.setScrollBarSize,com.netcetera.threeds.sdk.infrastructure.lx,com.netcetera.threeds.sdk.infrastructure.jo,com.netcetera.threeds.sdk.infrastructure.setFriction$getWarnings,java.lang.String,java.lang.String,com.netcetera.threeds.sdk.infrastructure.nc,com.netcetera.threeds.sdk.infrastructure.setProgressTintList,com.netcetera.threeds.sdk.infrastructure.setIndeterminateTintBlendMode$initialize); -} - --keep class com.netcetera.threeds.sdk.infrastructure.iz - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ja { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.je { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jh { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jj { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.jo - --keep class com.netcetera.threeds.sdk.infrastructure.jr { - com.netcetera.threeds.sdk.infrastructure.jo ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.api.ui.logic.UiCustomization,com.netcetera.threeds.sdk.infrastructure.lx); - com.netcetera.threeds.sdk.infrastructure.jo getWarnings(java.util.Map,com.netcetera.threeds.sdk.infrastructure.lx); -} - --keep class com.netcetera.threeds.sdk.infrastructure.js { - com.netcetera.threeds.sdk.api.ui.logic.UiCustomization ThreeDS2ServiceInstance(com.netcetera.threeds.sdk.api.ui.logic.UiCustomization); - java.util.Map ThreeDS2Service(java.util.Map); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.js { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.js { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jw { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jw { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jy { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jy { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ka { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ka { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jz { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jz { - void get(); - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.jx { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ke { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ke { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kf { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kf { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kd { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kd { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kg { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kg { - void getWarnings(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kl { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ki { - void get(long,long); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ki { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.kk { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ln { - void init$0(); - void init$1(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.lx - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mc { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.md { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mb { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mf { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mn { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mo { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mk$initialize { - void getWarnings(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ml { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mt { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mt { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ms { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ms { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mq { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.mp { - java.lang.Object getWarnings(java.lang.Object[],int,int,int); -} - --keep class com.netcetera.threeds.sdk.infrastructure.my { - java.lang.Object initialize(java.lang.Object[],int,int,int); -} - --keep class com.netcetera.threeds.sdk.infrastructure.my$ThreeDS2ServiceInstance - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mv { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.mw - --keep class com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance { - com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance initialize; com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance ThreeDS2Service; com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance ThreeDS2ServiceInstance;} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mw$ThreeDS2ServiceInstance { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.na { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.mz { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.nd { - (java.lang.Object); - java.lang.String get(java.lang.String); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nd { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nb { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nb { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.nc { - com.netcetera.threeds.sdk.infrastructure.nc initialize(com.netcetera.threeds.sdk.api.configparameters.ConfigParameters); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nc { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.nf { - void ThreeDS2ServiceInstance(java.lang.Object,java.lang.String); - java.lang.String getWarnings(java.lang.String,java.lang.String); - void ThreeDS2ServiceInstance(int,int,java.lang.String); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nf { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ni { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ne { - (); - void ThreeDS2ServiceInstance(java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ng { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ng { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nj { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nj { - void init$0(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nm { - void getWarnings(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.nr { - com.netcetera.threeds.sdk.infrastructure.nr ThreeDS2ServiceInstance(java.lang.String); - java.lang.String ThreeDS2Service(java.lang.String); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nr { - void getWarnings(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.no { - void get(java.lang.String); - void getWarnings(java.lang.String,java.lang.Object[]); - void initialize(java.lang.String); - void ThreeDS2Service(java.lang.String,java.lang.Object[]); - void getWarnings(java.lang.String,com.netcetera.threeds.sdk.infrastructure.nc); -} - --keep class com.netcetera.threeds.sdk.infrastructure.nq { - java.lang.Object ThreeDS2Service(java.lang.Object[],int,int,int); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.nq { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.np { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ob { - java.lang.String[] getWarnings(java.lang.Object[]); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ob { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.og { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.oh { - java.lang.CharSequence getWarnings(java.lang.CharSequence,java.lang.CharSequence); - boolean ThreeDS2ServiceInstance(java.lang.CharSequence); - boolean get(java.lang.CharSequence); - boolean get(java.lang.CharSequence,java.lang.CharSequence); - boolean ThreeDS2Service(java.lang.CharSequence,java.lang.CharSequence); - boolean initialize(java.lang.CharSequence); - java.lang.String[] ThreeDS2ServiceInstance(java.lang.String,java.lang.String); - boolean ThreeDS2Service(java.lang.CharSequence[]); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oh { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.of { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.oe { - java.lang.Long getWarnings;} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oe { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.oi { - java.util.Date initialize(java.util.Date,int); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oi { - (); -} - --keep class org.bouncycastle.jce.provider.NcaBouncyCastleProvider { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class org.bouncycastle.jce.provider.NcaBouncyCastleProvider { - void ThreeDS2ServiceInstance(); - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ok { - java.lang.String get(byte[]); - byte[] ThreeDS2Service(java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ok { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.om { - (); - byte[] ThreeDS2ServiceInstance(java.lang.String); - java.lang.String get(java.lang.String); - java.lang.String initialize(byte[]); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oj { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ol { - java.lang.Object[] initialize(int,int); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ol { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ol$get { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.oq { - (); - com.netcetera.threeds.sdk.infrastructure.oq$ThreeDS2Service initialize(); - com.netcetera.threeds.sdk.infrastructure.oq$ThreeDS2Service getWarnings(); - java.security.SecureRandom ThreeDS2ServiceInstance(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.oq$ThreeDS2Service { - void get(java.lang.String); - java.lang.String ThreeDS2ServiceInstance(); - java.lang.String ThreeDS2Service(); - void ThreeDS2Service(java.lang.String); - java.lang.String initialize(); - void getWarnings(java.lang.String); - void initialize(java.lang.String); - java.lang.String getWarnings(); - void ThreeDS2ServiceInstance(java.lang.String); - java.lang.String cleanup(); - void ThreeDS2ServiceInitializationCallback(java.lang.String); - java.lang.String createTransaction(); - void createTransaction(java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oo { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oo$4 { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.oo$get { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.or { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.on { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ot { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ov { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.pb { - java.lang.String ThreeDS2Service(); - boolean getWarnings(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.pa { - boolean ThreeDS2ServiceInstance(java.lang.String,java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.pa { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.oz { - com.netcetera.threeds.sdk.infrastructure.oz ThreeDS2ServiceInstance; (com.netcetera.threeds.sdk.infrastructure.oz$ThreeDS2ServiceInstance,java.lang.String[]); - void ThreeDS2ServiceInstance(java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.oz$ThreeDS2ServiceInstance { - com.netcetera.threeds.sdk.infrastructure.oz$ThreeDS2ServiceInstance ThreeDS2Service;} - --keep class com.netcetera.threeds.sdk.infrastructure.pf { - com.netcetera.threeds.sdk.infrastructure.pb getWarnings(java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.pe { - com.netcetera.threeds.sdk.infrastructure.pe get(); - com.netcetera.threeds.sdk.infrastructure.pf ThreeDS2ServiceInstance(); - com.netcetera.threeds.sdk.infrastructure.pf getWarnings(); - com.netcetera.threeds.sdk.infrastructure.pf initialize(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.pd { - org.slf4j.Logger get; java.lang.String ThreeDS2ServiceInstance; java.lang.String initialize; (); - void ThreeDS2Service(java.lang.String); - void get(java.lang.String); - java.lang.String ThreeDS2ServiceInstance(); - java.lang.String ThreeDS2Service(); - void initialize(com.netcetera.threeds.sdk.infrastructure.rd); - void getWarnings(java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qc { - com.netcetera.threeds.sdk.infrastructure.qe getWarnings(java.security.spec.ECParameterSpec); - com.netcetera.threeds.sdk.infrastructure.qe ThreeDS2Service(java.security.spec.ECParameterSpec,java.lang.String,java.security.SecureRandom); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qc { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qe { - java.security.interfaces.ECPublicKey ThreeDS2Service(); - java.security.interfaces.ECPrivateKey initialize(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qd { - java.security.Key ThreeDS2ServiceInitializationCallback(); - void initialize(java.lang.String); - java.lang.String cleanup(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qd$ThreeDS2ServiceInstance { - com.netcetera.threeds.sdk.infrastructure.qd get(java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qd$ThreeDS2ServiceInstance { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qk { - java.security.PrivateKey onError(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qk$getWarnings { - com.netcetera.threeds.sdk.infrastructure.qk ThreeDS2Service(java.security.Key); - com.netcetera.threeds.sdk.infrastructure.qk initialize(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.qk ThreeDS2Service(java.lang.String,java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qk$getWarnings { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qj$getWarnings { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qj$ThreeDS2Service { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qj$ThreeDS2ServiceInstance { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ql$ThreeDS2Service { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ql$ThreeDS2ServiceInstance { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ql$get { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qo { - (); - boolean getWarnings(); - java.lang.String getSDKVersion(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qp { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$initialize { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$ThreeDS2ServiceInstance { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$ThreeDS2Service { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$getWarnings { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qm$get { - void get(long,long); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$get { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qm$getSDKInfo { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qs { - java.lang.String ThreeDS2Service(java.lang.String[]); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qs { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qu { - void ThreeDS2Service(java.lang.String,java.lang.String); - void initialize(java.lang.String,java.lang.Object); - void ThreeDS2ServiceInstance(java.lang.String,com.netcetera.threeds.sdk.infrastructure.qd); - java.lang.String initialize(java.lang.String); - java.lang.Long ThreeDS2Service(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.qk get(java.lang.String,java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qu { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qt { - byte[] initialize; (); - void get(java.lang.String[]); - void get(java.lang.String); - java.lang.String onCompleted(); - void get(java.lang.String,java.lang.String); - void getSDKVersion(java.lang.String); - com.netcetera.threeds.sdk.infrastructure.qu onError(); - void ThreeDS2ServiceInstance(java.lang.String,java.lang.String); - java.lang.String cleanup(java.lang.String); - void createTransaction(java.lang.String); - java.lang.String addParam(); - void ThreeDS2ServiceInitializationCallback(java.lang.String); - java.security.Key getParamValue(); - void initialize(java.security.Key); - byte[] restrictedParameters(); - void ThreeDS2Service(byte[]); - boolean apiKey(); - com.netcetera.threeds.sdk.infrastructure.oz ConfigurationBuilder(); - void initialize(com.netcetera.threeds.sdk.infrastructure.oz); - void configureScheme(); - com.netcetera.threeds.sdk.infrastructure.oq removeParam(); - void ThreeDS2Service(com.netcetera.threeds.sdk.infrastructure.oq); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qq { - void get(java.security.Key); - java.security.Key get(java.security.Key,java.lang.Class); - void ThreeDS2Service(java.security.Key); - void ThreeDS2Service(java.security.Key,java.lang.String,int); - java.lang.Object get(java.lang.Object[],int,int,int); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qq { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qq { - void init$0(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qr { - (byte[]); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qr { - void init$0(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qz { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qw { - (); - boolean ThreeDS2ServiceInstance(); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qy { - java.security.spec.ECParameterSpec ThreeDS2ServiceInstance; java.lang.String getWarnings(java.security.spec.EllipticCurve); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.qy { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.qv { - (byte[]); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rd { - com.netcetera.threeds.sdk.infrastructure.rd get; com.netcetera.threeds.sdk.infrastructure.rd ThreeDS2ServiceInstance;} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.re { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.ra { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rc { - byte[] ThreeDS2Service; byte[] initialize(int); - byte[] ThreeDS2ServiceInstance(long); - boolean getWarnings(byte[],byte[]); - byte[] initialize(byte[][]); - byte[] ThreeDS2ServiceInstance(byte[],int,int); - byte[] ThreeDS2ServiceInstance(byte[]); - byte[] getWarnings(byte[]); - int initialize(byte[]); - int getWarnings(int); - int ThreeDS2ServiceInstance(int); - byte[] ThreeDS2Service(int,java.security.SecureRandom); - byte[] get(int); - java.lang.String get(byte[]); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rc { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rb { - java.lang.String getWarnings(java.lang.Throwable); - java.lang.String ThreeDS2ServiceInstance(java.lang.Throwable,java.lang.Class); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rb { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rg { - java.security.MessageDigest getWarnings(java.lang.String); - java.security.MessageDigest ThreeDS2ServiceInstance(java.lang.String,java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rg { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rj { - (java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ri { - (java.lang.String); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rh { - (java.lang.String); - (java.lang.String,java.lang.Throwable); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rf { - (java.lang.String); - (java.lang.String,java.lang.Throwable); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rk { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rl { - java.lang.String initialize(byte[],java.lang.String); - byte[] ThreeDS2ServiceInstance(java.lang.String); - byte[] getWarnings(java.lang.String); - byte[] getWarnings(java.lang.String,java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rl { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rn { - (java.lang.String); - (java.lang.String,java.lang.Throwable); -} - --keep class com.netcetera.threeds.sdk.infrastructure.rm { - javax.crypto.Mac initialize(java.lang.String,java.security.Key,java.lang.String); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rm { - (); -} - --keep class com.netcetera.threeds.sdk.infrastructure.ro { - byte[] initialize(byte[]); - byte[] ThreeDS2Service(byte[]); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.netcetera.threeds.sdk.infrastructure.rr { - (); -} - --keepclassmembers,allowobfuscation class androidx.activity.ComponentActivity { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class androidx.activity.ComponentActivity { - (int); - void onCreate(android.os.Bundle); - void onSaveInstanceState(android.os.Bundle); - java.lang.Object onRetainNonConfigurationInstance(); - java.lang.Object onRetainCustomNonConfigurationInstance(); - java.lang.Object getLastCustomNonConfigurationInstance(); - void setContentView(int); - void setContentView(android.view.View,android.view.ViewGroup$LayoutParams); - void addContentView(android.view.View,android.view.ViewGroup$LayoutParams); - android.content.Context peekAvailableContext(); - void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener); - void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener); - boolean onPreparePanel(int,android.view.View,android.view.Menu); - boolean onCreatePanelMenu(int,android.view.Menu); - boolean onMenuItemSelected(int,android.view.MenuItem); - void onPanelClosed(int,android.view.Menu); - void addMenuProvider(androidx.core.view.MenuProvider); - void addMenuProvider(androidx.core.view.MenuProvider,androidx.lifecycle.LifecycleOwner); - void addMenuProvider(androidx.core.view.MenuProvider,androidx.lifecycle.LifecycleOwner,androidx.lifecycle.Lifecycle$State); - void removeMenuProvider(androidx.core.view.MenuProvider); - void invalidateMenu(); - androidx.lifecycle.Lifecycle getLifecycle(); - androidx.lifecycle.ViewModelStore getViewModelStore(); - androidx.lifecycle.ViewModelProvider$Factory getDefaultViewModelProviderFactory(); - androidx.lifecycle.viewmodel.CreationExtras getDefaultViewModelCreationExtras(); - void onBackPressed(); - androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher(); - androidx.savedstate.SavedStateRegistry getSavedStateRegistry(); - void startActivityForResult(android.content.Intent,int); - void startActivityForResult(android.content.Intent,int,android.os.Bundle); - void startIntentSenderForResult(android.content.IntentSender,int,android.content.Intent,int,int,int); - void startIntentSenderForResult(android.content.IntentSender,int,android.content.Intent,int,int,int,android.os.Bundle); - void onActivityResult(int,int,android.content.Intent); - void onRequestPermissionsResult(int,java.lang.String[],int[]); - androidx.activity.result.ActivityResultLauncher registerForActivityResult(androidx.activity.result.contract.ActivityResultContract,androidx.activity.result.ActivityResultRegistry,androidx.activity.result.ActivityResultCallback); - androidx.activity.result.ActivityResultLauncher registerForActivityResult(androidx.activity.result.contract.ActivityResultContract,androidx.activity.result.ActivityResultCallback); - androidx.activity.result.ActivityResultRegistry getActivityResultRegistry(); - void onConfigurationChanged(android.content.res.Configuration); - void addOnConfigurationChangedListener(androidx.core.util.Consumer); - void removeOnConfigurationChangedListener(androidx.core.util.Consumer); - void onTrimMemory(int); - void addOnTrimMemoryListener(androidx.core.util.Consumer); - void removeOnTrimMemoryListener(androidx.core.util.Consumer); - void onNewIntent(android.content.Intent); - void addOnNewIntentListener(androidx.core.util.Consumer); - void removeOnNewIntentListener(androidx.core.util.Consumer); - void onMultiWindowModeChanged(boolean); - void onMultiWindowModeChanged(boolean,android.content.res.Configuration); - void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer); - void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer); - void onPictureInPictureModeChanged(boolean); - void onPictureInPictureModeChanged(boolean,android.content.res.Configuration); - void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer); - void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer); - void reportFullyDrawn(); -} - --keep class androidx.activity.contextaware.OnContextAvailableListener - --keep class androidx.activity.OnBackPressedDispatcher - --keepclassmembers,allowoptimization,allowobfuscation class androidx.activity.OnBackPressedDispatcher { - (); -} - --keep class androidx.activity.contextaware.OnContextAvailableListener - --keep class androidx.activity.result.ActivityResultCallback - --keep class androidx.activity.result.ActivityResultLauncher - --keepclassmembers,allowoptimization,allowobfuscation class androidx.activity.result.ActivityResultLauncher { - (); -} - --keep class androidx.activity.result.ActivityResultRegistry - --keepclassmembers,allowoptimization,allowobfuscation class androidx.activity.result.ActivityResultRegistry { - (); -} - --keep class androidx.activity.result.contract.ActivityResultContract - --keepclassmembers,allowoptimization,allowobfuscation class androidx.activity.result.contract.ActivityResultContract { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class androidx.appcompat.app.ActionBar { - (); -} - --keepclassmembers,allowobfuscation class androidx.appcompat.app.AppCompatActivity { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class androidx.appcompat.app.AppCompatActivity { - (int); - void attachBaseContext(android.content.Context); - void setTheme(int); - void onPostCreate(android.os.Bundle); - androidx.appcompat.app.ActionBar getSupportActionBar(); - void setSupportActionBar(androidx.appcompat.widget.Toolbar); - android.view.MenuInflater getMenuInflater(); - void setContentView(int); - void setContentView(android.view.View,android.view.ViewGroup$LayoutParams); - void addContentView(android.view.View,android.view.ViewGroup$LayoutParams); - void onConfigurationChanged(android.content.res.Configuration); - void onPostResume(); - void onStart(); - void onStop(); - android.view.View findViewById(int); - boolean onMenuItemSelected(int,android.view.MenuItem); - void onDestroy(); - void onTitleChanged(java.lang.CharSequence,int); - boolean supportRequestWindowFeature(int); - void supportInvalidateOptionsMenu(); - void invalidateOptionsMenu(); - void onSupportActionModeStarted(androidx.appcompat.view.ActionMode); - void onSupportActionModeFinished(androidx.appcompat.view.ActionMode); - androidx.appcompat.view.ActionMode onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode$Callback); - androidx.appcompat.view.ActionMode startSupportActionMode(androidx.appcompat.view.ActionMode$Callback); - void setSupportProgressBarVisibility(boolean); - void setSupportProgressBarIndeterminateVisibility(boolean); - void setSupportProgressBarIndeterminate(boolean); - void setSupportProgress(int); - void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder); - void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder); - boolean onSupportNavigateUp(); - android.content.Intent getSupportParentActivityIntent(); - boolean supportShouldUpRecreateTask(android.content.Intent); - void supportNavigateUpTo(android.content.Intent); - void onContentChanged(); - void onSupportContentChanged(); - androidx.appcompat.app.ActionBarDrawerToggle$Delegate getDrawerToggleDelegate(); - boolean onMenuOpened(int,android.view.Menu); - void onPanelClosed(int,android.view.Menu); - androidx.appcompat.app.AppCompatDelegate getDelegate(); - boolean dispatchKeyEvent(android.view.KeyEvent); - android.content.res.Resources getResources(); - boolean onKeyDown(int,android.view.KeyEvent); - void openOptionsMenu(); - void closeOptionsMenu(); - void onNightModeChanged(int); - void onLocalesChanged(androidx.core.os.LocaleListCompat); -} - --keep class androidx.appcompat.app.ActionBar - --keepclassmembers,allowshrinking,allowobfuscation class androidx.appcompat.app.AppCompatCallback { - void onSupportActionModeStarted(androidx.appcompat.view.ActionMode); - void onSupportActionModeFinished(androidx.appcompat.view.ActionMode); - androidx.appcompat.view.ActionMode onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode$Callback); -} - --keep class androidx.appcompat.view.ActionMode - --keep class androidx.appcompat.app.AppCompatDelegate - --keepclassmembers,allowshrinking,allowobfuscation class androidx.appcompat.app.AppCompatDelegate { - int MODE_NIGHT_FOLLOW_SYSTEM; int MODE_NIGHT_AUTO_TIME; int MODE_NIGHT_AUTO; int MODE_NIGHT_NO; int MODE_NIGHT_YES; int MODE_NIGHT_AUTO_BATTERY; int MODE_NIGHT_UNSPECIFIED; int FEATURE_SUPPORT_ACTION_BAR; int FEATURE_SUPPORT_ACTION_BAR_OVERLAY; int FEATURE_ACTION_MODE_OVERLAY; androidx.appcompat.app.AppCompatDelegate create(android.app.Activity,androidx.appcompat.app.AppCompatCallback); - androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog,androidx.appcompat.app.AppCompatCallback); - androidx.appcompat.app.AppCompatDelegate create(android.content.Context,android.view.Window,androidx.appcompat.app.AppCompatCallback); - androidx.appcompat.app.AppCompatDelegate create(android.content.Context,android.app.Activity,androidx.appcompat.app.AppCompatCallback); - androidx.appcompat.app.ActionBar getSupportActionBar(); - void setSupportActionBar(androidx.appcompat.widget.Toolbar); - android.view.MenuInflater getMenuInflater(); - void onCreate(android.os.Bundle); - void onPostCreate(android.os.Bundle); - void onConfigurationChanged(android.content.res.Configuration); - void onStart(); - void onStop(); - void onPostResume(); - void setTheme(int); - android.view.View findViewById(int); - void setContentView(android.view.View); - void setContentView(int); - void setContentView(android.view.View,android.view.ViewGroup$LayoutParams); - void addContentView(android.view.View,android.view.ViewGroup$LayoutParams); - void attachBaseContext(android.content.Context); - android.content.Context attachBaseContext2(android.content.Context); - void setTitle(java.lang.CharSequence); - void invalidateOptionsMenu(); - void onDestroy(); - androidx.appcompat.app.ActionBarDrawerToggle$Delegate getDrawerToggleDelegate(); - boolean requestWindowFeature(int); - boolean hasWindowFeature(int); - androidx.appcompat.view.ActionMode startSupportActionMode(androidx.appcompat.view.ActionMode$Callback); - void installViewFactory(); - android.view.View createView(android.view.View,java.lang.String,android.content.Context,android.util.AttributeSet); - void setHandleNativeActionModesEnabled(boolean); - boolean isHandleNativeActionModesEnabled(); - void onSaveInstanceState(android.os.Bundle); - boolean applyDayNight(); - void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher); - android.content.Context getContextForDelegate(); - void setLocalNightMode(int); - int getLocalNightMode(); - void setDefaultNightMode(int); - void setApplicationLocales(androidx.core.os.LocaleListCompat); - androidx.core.os.LocaleListCompat getApplicationLocales(); - int getDefaultNightMode(); - void setCompatVectorFromResourcesEnabled(boolean); - boolean isCompatVectorFromResourcesEnabled(); -} - --keep class androidx.appcompat.view.ActionMode - --keepclassmembers,allowoptimization,allowobfuscation class androidx.appcompat.view.ActionMode { - (); -} - --keep class androidx.appcompat.view.ActionMode$Callback - --keep class androidx.appcompat.widget.Toolbar - --keepclassmembers,allowshrinking,allowobfuscation class androidx.core.app.ActivityCompat$OnRequestPermissionsResultCallback { - void onRequestPermissionsResult(int,java.lang.String[],int[]); -} - --keepclassmembers,allowshrinking,allowobfuscation class androidx.core.app.ActivityCompat$RequestPermissionsRequestCodeValidator { - void validateRequestPermissionsRequestCode(int); -} - --keepclassmembers,allowobfuscation class androidx.core.app.ComponentActivity { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class androidx.core.app.ComponentActivity { - void putExtraData(androidx.core.app.ComponentActivity$ExtraData); - void onCreate(android.os.Bundle); - void onSaveInstanceState(android.os.Bundle); - androidx.core.app.ComponentActivity$ExtraData getExtraData(java.lang.Class); - androidx.lifecycle.Lifecycle getLifecycle(); - boolean superDispatchKeyEvent(android.view.KeyEvent); - boolean dispatchKeyShortcutEvent(android.view.KeyEvent); - boolean dispatchKeyEvent(android.view.KeyEvent); - boolean shouldDumpInternalState(java.lang.String[]); -} - --keep class androidx.core.app.ComponentActivity$ExtraData - --keep class androidx.core.app.ComponentActivity$ExtraData - --keepclassmembers,allowoptimization,allowobfuscation class androidx.core.app.ComponentActivity$ExtraData { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class androidx.core.app.SharedElementCallback { - (); -} - --keep class androidx.core.app.TaskStackBuilder - --keepclassmembers,allowshrinking,allowobfuscation class androidx.core.content.res.ResourcesCompat { - int ID_NULL; void clearCachesForTheme(android.content.res.Resources$Theme); - android.graphics.drawable.Drawable getDrawable(android.content.res.Resources,int,android.content.res.Resources$Theme); - android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources,int,int,android.content.res.Resources$Theme); - int getColor(android.content.res.Resources,int,android.content.res.Resources$Theme); - android.content.res.ColorStateList getColorStateList(android.content.res.Resources,int,android.content.res.Resources$Theme); - float getFloat(android.content.res.Resources,int); - android.graphics.Typeface getFont(android.content.Context,int); - android.graphics.Typeface getCachedFont(android.content.Context,int); - void getFont(android.content.Context,int,androidx.core.content.res.ResourcesCompat$FontCallback,android.os.Handler); - android.graphics.Typeface getFont(android.content.Context,int,android.util.TypedValue,int,androidx.core.content.res.ResourcesCompat$FontCallback); -} - --keep class androidx.core.content.res.ResourcesCompat$FontCallback - --keep class androidx.core.content.res.ResourcesCompat$FontCallback - --keepclassmembers,allowobfuscation class androidx.core.content.res.ResourcesCompat$FontCallback { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class androidx.core.content.res.ResourcesCompat$FontCallback { - void onFontRetrieved(android.graphics.Typeface); - void onFontRetrievalFailed(int); - void callbackSuccessAsync(android.graphics.Typeface,android.os.Handler); - void callbackFailAsync(int,android.os.Handler); - android.os.Handler getHandler(android.os.Handler); -} - --keep class androidx.core.os.LocaleListCompat - --keepclassmembers,allowshrinking,allowobfuscation class androidx.core.os.LocaleListCompat { - androidx.core.os.LocaleListCompat wrap(java.lang.Object); - androidx.core.os.LocaleListCompat wrap(android.os.LocaleList); - java.lang.Object unwrap(); - androidx.core.os.LocaleListCompat create(java.util.Locale[]); - java.util.Locale get(int); - boolean isEmpty(); - int size(); - int indexOf(java.util.Locale); - java.lang.String toLanguageTags(); - java.util.Locale getFirstMatch(java.lang.String[]); - androidx.core.os.LocaleListCompat getEmptyLocaleList(); - androidx.core.os.LocaleListCompat forLanguageTags(java.lang.String); - androidx.core.os.LocaleListCompat getAdjustedDefault(); - androidx.core.os.LocaleListCompat getDefault(); - boolean matchesLanguageAndScript(java.util.Locale,java.util.Locale); - boolean equals(java.lang.Object); - int hashCode(); - java.lang.String toString(); -} - --keep class androidx.core.util.Consumer - --keep class androidx.core.view.MenuProvider - --keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.DialogFragment { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.Fragment { - (); -} - --keepclassmembers,allowobfuscation class androidx.fragment.app.FragmentActivity { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class androidx.fragment.app.FragmentActivity { - (int); - void onActivityResult(int,int,android.content.Intent); - void supportFinishAfterTransition(); - void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback); - void setExitSharedElementCallback(androidx.core.app.SharedElementCallback); - void supportPostponeEnterTransition(); - void supportStartPostponedEnterTransition(); - void onMultiWindowModeChanged(boolean); - void onPictureInPictureModeChanged(boolean); - void onConfigurationChanged(android.content.res.Configuration); - void onCreate(android.os.Bundle); - boolean onCreatePanelMenu(int,android.view.Menu); - android.view.View onCreateView(android.view.View,java.lang.String,android.content.Context,android.util.AttributeSet); - android.view.View onCreateView(java.lang.String,android.content.Context,android.util.AttributeSet); - void onDestroy(); - void onLowMemory(); - boolean onMenuItemSelected(int,android.view.MenuItem); - void onPanelClosed(int,android.view.Menu); - void onPause(); - void onNewIntent(android.content.Intent); - void onStateNotSaved(); - void onResume(); - void onPostResume(); - void onResumeFragments(); - boolean onPreparePanel(int,android.view.View,android.view.Menu); - boolean onPrepareOptionsPanel(android.view.View,android.view.Menu); - void onStart(); - void onStop(); - void supportInvalidateOptionsMenu(); - void dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[]); - void onAttachFragment(androidx.fragment.app.Fragment); - androidx.fragment.app.FragmentManager getSupportFragmentManager(); - androidx.loader.app.LoaderManager getSupportLoaderManager(); - void validateRequestPermissionsRequestCode(int); - void onRequestPermissionsResult(int,java.lang.String[],int[]); - void startActivityFromFragment(androidx.fragment.app.Fragment,android.content.Intent,int); - void startActivityFromFragment(androidx.fragment.app.Fragment,android.content.Intent,int,android.os.Bundle); - void startIntentSenderFromFragment(androidx.fragment.app.Fragment,android.content.IntentSender,int,android.content.Intent,int,int,int,android.os.Bundle); -} - --keep class androidx.core.app.SharedElementCallback - --keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.FragmentFactory { - (); -} - --keep class androidx.fragment.app.FragmentManager - --keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.FragmentManager { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.FragmentManager$FragmentLifecycleCallbacks { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class androidx.fragment.app.FragmentTransaction { - (); -} - --keep class androidx.lifecycle.Lifecycle - --keepclassmembers,allowoptimization,allowobfuscation class androidx.lifecycle.Lifecycle { - (); -} - --keep class androidx.lifecycle.Lifecycle$State - --keep class androidx.lifecycle.LifecycleOwner - --keepclassmembers,allowoptimization,allowobfuscation class androidx.lifecycle.LiveData { - (); -} - --keep class androidx.lifecycle.ViewModelProvider$Factory - --keep class androidx.lifecycle.ViewModelStore - --keepclassmembers,allowoptimization,allowobfuscation class androidx.lifecycle.ViewModelStore { - (); -} - --keep class androidx.lifecycle.viewmodel.CreationExtras - --keepclassmembers,allowoptimization,allowobfuscation class androidx.lifecycle.viewmodel.CreationExtras { - (); -} - --keep class androidx.loader.app.LoaderManager - --keepclassmembers,allowoptimization,allowobfuscation class androidx.loader.app.LoaderManager { - (); -} - --keep class androidx.savedstate.SavedStateRegistry - --keepclassmembers,allowoptimization,allowobfuscation class androidx.savedstate.SavedStateRegistry { - (); -} - --keep class com.google.android.gms.common.GoogleApiAvailability { - int isGooglePlayServicesAvailable(android.content.Context); - com.google.android.gms.common.GoogleApiAvailability getInstance(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.google.android.gms.common.GoogleApiAvailability { - (); -} - --keep class com.google.android.gms.common.GooglePlayServicesNotAvailableException - --keep class com.google.android.gms.common.GooglePlayServicesRepairableException - --keepclassmembers,allowobfuscation class com.google.android.gms.common.api.internal.zabw { - (); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.google.android.gms.common.api.internal.zabw { - void zaa(); -} - --keepclassmembers,allowshrinking,allowobfuscation class com.google.android.gms.common.api.internal.zabx { - (com.google.android.gms.common.api.internal.zabw); - void onReceive(android.content.Context,android.content.Intent); - void zaa(android.content.Context); - void zab(); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable { - (); -} - --keep class com.google.android.gms.security.ProviderInstaller { - void installIfNeeded(android.content.Context); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.google.android.gms.security.ProviderInstaller { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class com.google.android.gms.tasks.Task { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.asn1.ASN1Object { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.asn1.ASN1Sequence { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.asn1.ASN1Set { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.jcajce.provider.asymmetric.mlkem.MLKEMKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.jcajce.provider.symmetric.util.ClassUtil { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.jcajce.provider.util.AlgorithmProvider { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.jce.provider.BouncyCastleProvider { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.bike.BIKEKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.cmce.CMCEKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.dilithium.DilithiumKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.falcon.FalconKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.hqc.HQCKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.kyber.KyberKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.lms.LMSKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.newhope.NHKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.ntru.NTRUKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.picnic.PicnicKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.sphincs.Sphincs256KeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.sphincsplus.SPHINCSPlusKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.xmss.XMSSKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.pqc.jcajce.provider.xmss.XMSSMTKeyFactorySpi { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.bouncycastle.util.Strings { - (); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.greenrobot.eventbus.EventBus { - (); -} - --keep class org.slf4j.Logger { - boolean isDebugEnabled(); -} - --keep class org.slf4j.LoggerFactory { - org.slf4j.Logger getLogger(java.lang.Class); -} - --keepclassmembers,allowoptimization,allowobfuscation class org.slf4j.helpers.MessageFormatter { - (); -} - --keepclassmembers !abstract class !com.google.ads.** extends android.view.View { - public (android.content.Context); - public (android.content.Context,android.util.AttributeSet); - public (android.content.Context,android.util.AttributeSet,int); - public void set*(...); -} - --keepclassmembers !abstract class * { - public (android.content.Context,android.util.AttributeSet); - public (android.content.Context,android.util.AttributeSet,int); -} - -# Enumerations. --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - --keepclassmembers class * extends javax.net.ssl.SSLSocketFactory { - ** sslParameters; ** context; ** delegate;} - -# ################################# -# Keep # -# # Keep API enumerations ## --keepclassmembers enum com.netcetera.threeds.sdk.api.** { - ; ; +# ============================================ +# SUPPRESSION DES LOGS +# ============================================ +-assumenosideeffects class android.util.Log { + public static int v(...); + public static int i(...); + public static int w(...); + public static int d(...); + public static int e(...); } +-assumenosideeffects class org.slf4j.Logger { + public void trace(...); + public void debug(...); + public void info(...); +} \ No newline at end of file diff --git a/monext/src/androidTest/kotlin/com/monext/sdk/PaymentSheetTest.kt b/monext/src/androidTest/kotlin/com/monext/sdk/PaymentSheetTest.kt index a35d7b6..44cc522 100644 --- a/monext/src/androidTest/kotlin/com/monext/sdk/PaymentSheetTest.kt +++ b/monext/src/androidTest/kotlin/com/monext/sdk/PaymentSheetTest.kt @@ -6,10 +6,6 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.performTouchInput import androidx.compose.ui.test.swipeDown -import com.monext.sdk.MnxtEnvironment -import com.monext.sdk.MnxtSDKContext -import com.monext.sdk.PaymentResult -import com.monext.sdk.PaymentSheet import org.junit.Before import org.junit.Rule import org.junit.Test @@ -47,7 +43,7 @@ class PaymentSheetTest { // Assert - Vérifie que le bottom sheet est visible composeTestRule - .onNodeWithTag("payment_bottom_sheet") + .onNodeWithTag("payment_bottom_sheet") .assertIsDisplayed() } diff --git a/monext/src/androidTest/kotlin/com/monext/sdk/SdkTestHelper.kt b/monext/src/androidTest/kotlin/com/monext/sdk/SdkTestHelper.kt new file mode 100644 index 0000000..830ef17 --- /dev/null +++ b/monext/src/androidTest/kotlin/com/monext/sdk/SdkTestHelper.kt @@ -0,0 +1,50 @@ +package com.monext.sdk + +import com.monext.sdk.internal.api.model.response.SessionState +import com.monext.sdk.internal.api.model.response.SessionStateType +import com.monext.sdk.internal.preview.PreviewSamples.Companion.posAddress +import com.monext.sdk.internal.preview.PreviewSamples.Companion.sessionInfo +import com.monext.sdk.internal.threeds.model.PaymentSdkChallenge +import com.monext.sdk.internal.threeds.model.SdkChallengeData + +/** + * Helper pour la construction des données de test + */ +class SdkTestHelper { + companion object { + + internal fun createSdkChallengeData(): SdkChallengeData = SdkChallengeData( + cardType = 1, + threeDSServerTransID = "threeDSServerTransID", + threeDSVersion = "threeDSVersion", + authenticationType = "authenticationType", + transStatus = "transStatus", + sdkTransID = "sdkTransID", + dsTransID = "dsTransID", + acsTransID = "acsTransID", + acsRenderingType = "acsRenderingType", + acsReferenceNumber = "acsReferenceNumber", + acsSignedContent = "acsSignedContent", + acsOperatorID = "acsOperatorID", + acsChallengeMandated = "acsChallengeMandated" + ) + + internal fun createSessionStateSdkChallenge() = SessionState( + token = "fake_token", + type = SessionStateType.SDK_CHALLENGE, + creationDate = "Tue Mar 25 12:33:22 CET 2025", + cancelUrl = "https://yourdomain.com:8080/route/1.0/returns?paylinetoken=fake_token", + pointOfSale = "POS_Fake", + language = "en", + returnUrl = "https://yourdomain.com:8080/route/1.0/returns?paylinetoken=fake_token", + automaticRedirectAtSessionsEnd = false, + info = sessionInfo, + pointOfSaleAddress = posAddress, + isSandbox = true, + paymentMethodsList = null, + paymentSuccess = null, + paymentFailure = null, + paymentSdkChallenge = PaymentSdkChallenge(createSdkChallengeData()) + ) + } +} \ No newline at end of file diff --git a/monext/src/androidTest/kotlin/com/monext/sdk/internal/threeds/view/PaymentSdkChallengeScreenTest.kt b/monext/src/androidTest/kotlin/com/monext/sdk/internal/threeds/view/PaymentSdkChallengeScreenTest.kt new file mode 100644 index 0000000..8426b33 --- /dev/null +++ b/monext/src/androidTest/kotlin/com/monext/sdk/internal/threeds/view/PaymentSdkChallengeScreenTest.kt @@ -0,0 +1,94 @@ +package com.monext.sdk.internal.threeds.view + +import android.os.StrictMode +import androidx.activity.compose.LocalActivity +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.monext.sdk.Appearance +import com.monext.sdk.FakeTestActivity +import com.monext.sdk.LocalAppearance +import com.monext.sdk.LocalEnvironment +import com.monext.sdk.MnxtEnvironment +import com.monext.sdk.PaymentOverlayToggle +import com.monext.sdk.SdkTestHelper +import com.monext.sdk.internal.data.LocalSessionStateRepo +import com.monext.sdk.internal.data.SessionStateRepository +import com.monext.sdk.internal.threeds.model.AuthenticationResponse +import com.monext.sdk.internal.threeds.model.ChallengeUseCaseCallback +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.mockk +import io.mockk.slot +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class PaymentSdkChallengeScreenTest { + + private val stateHistory = mutableListOf() + + @RelaxedMockK + private lateinit var sessionStateRepositoryMock : SessionStateRepository + + @get:Rule + val composeTestRule = createAndroidComposeRule() + + @Before + fun setup() { + MockKAnnotations.init(this) + // Désactiver StrictMode pour les tests + StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX) + StrictMode.setVmPolicy(StrictMode.VmPolicy.LAX) + } + + @Test + fun paymentSdkChallengeScreen_shouldStartChallengeProcess() { + + // Arrange + val sdkChallengeData = SdkTestHelper.createSdkChallengeData() + val testAppearance = Appearance(headerTitle = "Monext SDK Preview") + val testEnvironment = MnxtEnvironment.Sandbox + val authenticationResponseMock = mockk(relaxed = true) + val callbackSlot = slot() + + // Mock + coEvery { sessionStateRepositoryMock.makeThreeDsChallengeFlow(any(), any(),any(),capture(callbackSlot)) } answers { + // On mock la reponse pour invoquer la callback + callbackSlot.captured.onChallengeCompletion(authenticationResponseMock) + } + + // Act + composeTestRule.activity.setTestComposable { + CompositionLocalProvider( + LocalAppearance provides testAppearance, + LocalEnvironment provides testEnvironment, + LocalSessionStateRepo provides sessionStateRepositoryMock, + LocalActivity provides composeTestRule.activity + ) { + PaymentSdkChallengeScreen(sdkChallengeData = sdkChallengeData) { state -> stateHistory.add(state) } + } + } + + // Attendre que tous les effets soient exécutés + composeTestRule.waitForIdle() + + // Assert + coVerify { sessionStateRepositoryMock.makeThreeDsChallengeFlow( + activity = composeTestRule.activity, + sdkChallengeData = sdkChallengeData, + theme = testAppearance, + useCaseCallback = any()) + } + coVerify { sessionStateRepositoryMock.makeSdkPayment(authenticationResponseMock) } + + assertEquals(PaymentOverlayToggle.on(), stateHistory[0]) + assertEquals(PaymentOverlayToggle.off(), stateHistory[1]) + } + +} \ No newline at end of file diff --git a/monext/src/androidTest/kotlin/com/monext/sdk/presentation/PaymentContainerTest.kt b/monext/src/androidTest/kotlin/com/monext/sdk/presentation/PaymentContainerTest.kt index 15c3291..a45f608 100644 --- a/monext/src/androidTest/kotlin/com/monext/sdk/presentation/PaymentContainerTest.kt +++ b/monext/src/androidTest/kotlin/com/monext/sdk/presentation/PaymentContainerTest.kt @@ -9,12 +9,12 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.monext.sdk.Appearance import com.monext.sdk.FakeTestActivity import com.monext.sdk.LocalAppearance +import com.monext.sdk.PaymentOverlayToggle import com.monext.sdk.PaymentResult import com.monext.sdk.internal.api.model.response.SessionState import com.monext.sdk.internal.api.model.response.SessionStateType import com.monext.sdk.internal.presentation.PaymentContainer import com.monext.sdk.internal.preview.PreviewSamples.Companion.buildSessionState - import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -27,11 +27,14 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class PaymentContainerTest { + private val stateHistory = mutableListOf() + @Before fun setup() { // Désactiver StrictMode pour les tests StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX) StrictMode.setVmPolicy(StrictMode.VmPolicy.LAX) + stateHistory.clear() } @get:Rule val composeTestRule = createAndroidComposeRule() @@ -90,8 +93,9 @@ class PaymentContainerTest { private fun executeSessionStateTest(sessionState: SessionState, expectedTransactionState: PaymentResult.TransactionState, expectedTag : String) { var paymentResult: PaymentResult? = null - var showingChange: Boolean = true + var showingChange = true composeTestRule.activity.setTestComposable { + CompositionLocalProvider(LocalAppearance provides appearance) { PaymentContainer( sessionState, @@ -102,8 +106,9 @@ class PaymentContainerTest { paymentResult = result }, { - result -> showingChange = result - }) + result -> showingChange = result + } + ) { state -> stateHistory.add(state) } } } diff --git a/monext/src/debug/assets/logback-android.xml b/monext/src/debug/assets/logback-android.xml new file mode 100644 index 0000000..e1c96a7 --- /dev/null +++ b/monext/src/debug/assets/logback-android.xml @@ -0,0 +1,15 @@ + + + + %msg%n + + + + + + + + + + + \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/Appearance.kt b/monext/src/main/kotlin/com/monext/sdk/Appearance.kt index a40285f..604a16c 100644 --- a/monext/src/main/kotlin/com/monext/sdk/Appearance.kt +++ b/monext/src/main/kotlin/com/monext/sdk/Appearance.kt @@ -216,8 +216,8 @@ class Appearance( // region Internal internal companion object { - internal val cardNetworkFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("MMyy") //SimpleDateFormat("MMyy", Locale.US) - internal val cardPresentationFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("MM / yy") //SimpleDateFormat("MM / yy", Locale.US) + internal val cardNetworkFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("MMyy") + internal val cardPresentationFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("MM / yy") } // endregion diff --git a/monext/src/main/kotlin/com/monext/sdk/MnxtSDKConfiguration.kt b/monext/src/main/kotlin/com/monext/sdk/MnxtSDKConfiguration.kt index 77dd863..1b1aa8b 100644 --- a/monext/src/main/kotlin/com/monext/sdk/MnxtSDKConfiguration.kt +++ b/monext/src/main/kotlin/com/monext/sdk/MnxtSDKConfiguration.kt @@ -1,7 +1,5 @@ package com.monext.sdk -import com.monext.sdk.internal.service.Logger - /** Various fields used by the SDK */ data class MnxtSDKConfiguration( @@ -11,9 +9,4 @@ data class MnxtSDKConfiguration( * possible values: EN, FR */ val language: String = "EN", - - /** - * TODO: - */ - val displayFinalState: Boolean = true -) \ No newline at end of file + ) \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/PaymentSheet.kt b/monext/src/main/kotlin/com/monext/sdk/PaymentSheet.kt index 53a7956..042b2af 100644 --- a/monext/src/main/kotlin/com/monext/sdk/PaymentSheet.kt +++ b/monext/src/main/kotlin/com/monext/sdk/PaymentSheet.kt @@ -160,7 +160,6 @@ fun PaymentSheet(isShowing: Boolean, sessionToken: String, sdkContext: MnxtSDKCo scope.launch { sheetState.hide() }.invokeOnCompletion { -// if (!sheetState.isVisible) { onResult( PaymentResult.SheetDismissed( viewModel.sessionState.value?.type?.toTransactionState() @@ -169,7 +168,6 @@ fun PaymentSheet(isShowing: Boolean, sessionToken: String, sdkContext: MnxtSDKCo if (!sheetState.isVisible) { onIsShowingChange?.invoke(false) } -// } } } @@ -194,7 +192,8 @@ fun PaymentSheet(isShowing: Boolean, sessionToken: String, sdkContext: MnxtSDKCo onRedirectionComplete = { viewModel.updateSessionState(sessionToken) }, onRetry = { /* TODO: implement RETRY */ }, onResult = onResult, - onIsShowingChange = isShowingChangeWrapper + onIsShowingChange = isShowingChangeWrapper, + showOverlay = { showingOverlay = it } ) } @@ -215,7 +214,17 @@ internal data class PaymentOverlayToggle( val paymentMethodCardCode: PaymentMethodCardCode? ) { companion object { - fun on(cardCode: PaymentMethodCardCode?): PaymentOverlayToggle = PaymentOverlayToggle(true, cardCode) + /** + * Objet pour persister le dernier cardCode / network sélectionné + */ + private var selectedCardCode:PaymentMethodCardCode? = null + + fun on(cardCode: PaymentMethodCardCode?): PaymentOverlayToggle { + // On persiste le dernier cardCode sélectionné + selectedCardCode = cardCode; + return PaymentOverlayToggle(true, cardCode) + } + fun on(): PaymentOverlayToggle = PaymentOverlayToggle(true, selectedCardCode) fun off(): PaymentOverlayToggle = PaymentOverlayToggle(false, null) } } diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/api/PaymentAPI.kt b/monext/src/main/kotlin/com/monext/sdk/internal/api/PaymentAPI.kt index 163c728..0d93b59 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/api/PaymentAPI.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/api/PaymentAPI.kt @@ -11,6 +11,7 @@ import com.monext.sdk.internal.data.CardNetwork import com.monext.sdk.internal.data.sessionstate.PaymentMethodCardCode import com.monext.sdk.internal.exception.NetworkError import com.monext.sdk.internal.service.Logger +import com.monext.sdk.internal.threeds.model.AuthenticationResponse import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json @@ -38,6 +39,9 @@ internal interface PaymentAPI { @Throws(NetworkError::class) suspend fun fetchDirectoryServerSdkKeys(sessionToken: String): DirectoryServerSdkKeyResponse + @Throws(NetworkError::class) + suspend fun sdkPaymentRequest(sessionToken: String, params: AuthenticationResponse): SessionState + fun updateContext(context: InternalSDKContext) } @@ -142,6 +146,18 @@ internal class PaymentAPIImpl( return makeRequest(httpRequest) } + /** + * POST /token/{token}/SdkPaymentRequest + */ + @OptIn(ExperimentalSerializationApi::class) + @Throws(NetworkError::class) + override suspend fun sdkPaymentRequest(sessionToken: String, params: AuthenticationResponse): SessionState { + val baseUrl = buildBaseUrl(environment) + val url = appendPath(baseUrl, sessionToken, "SdkPaymentRequest") + val httpRequest = buildHttpRequest(url, method = HttpMethod.POST, body = json.encodeToString(params)) + return makeRequest(httpRequest) + } + // region Internal /** diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/api/ProxyHttpClient.kt b/monext/src/main/kotlin/com/monext/sdk/internal/api/ProxyHttpClient.kt index de1456f..df5bacb 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/api/ProxyHttpClient.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/api/ProxyHttpClient.kt @@ -12,7 +12,7 @@ import javax.net.ssl.HttpsURLConnection /** * Interface pour abstraire les appels HTTP */ -interface HttpClient { +internal fun interface HttpClient { suspend fun execute(request: HttpRequest): HttpResponse } diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/api/configuration/InternalSDKContext.kt b/monext/src/main/kotlin/com/monext/sdk/internal/api/configuration/InternalSDKContext.kt index cc2aa95..4ccef3b 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/api/configuration/InternalSDKContext.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/api/configuration/InternalSDKContext.kt @@ -14,5 +14,5 @@ class InternalSDKContext(sdkContext: MnxtSDKContext) { val environment: MnxtEnvironment = sdkContext.environment val config: MnxtSDKConfiguration = sdkContext.config val appearance: Appearance = sdkContext.appearance - val logger: Logger = CustomLogger() + var logger: Logger = CustomLogger() } \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/api/model/response/SessionStateResponse.kt b/monext/src/main/kotlin/com/monext/sdk/internal/api/model/response/SessionStateResponse.kt index 6e037e5..cfba19c 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/api/model/response/SessionStateResponse.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/api/model/response/SessionStateResponse.kt @@ -7,6 +7,7 @@ import com.monext.sdk.internal.data.sessionstate.PaymentRedirectNoResponse import com.monext.sdk.internal.data.sessionstate.PaymentSuccess import com.monext.sdk.internal.api.model.PointOfSaleAddress import com.monext.sdk.internal.api.model.SessionInfo +import com.monext.sdk.internal.threeds.model.PaymentSdkChallenge import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable import kotlinx.serialization.descriptors.PrimitiveKind @@ -31,7 +32,8 @@ internal data class SessionState( val paymentMethodsList: PaymentMethodsList? = null, val paymentRedirectNoResponse: PaymentRedirectNoResponse? = null, val paymentSuccess: PaymentSuccess? = null, - val paymentFailure: PaymentFailure? = null + val paymentFailure: PaymentFailure? = null, + val paymentSdkChallenge: PaymentSdkChallenge? = null ) @Serializable(with = SessionStateTypeSerializer::class) @@ -44,12 +46,13 @@ internal enum class SessionStateType { PAYMENT_FAILURE_WITH_RETRY, PAYMENT_CANCELED, TOKEN_EXPIRED, + SDK_CHALLENGE, UNKNOWN; fun toTransactionState(): PaymentResult.TransactionState? = when (this) { - PAYMENT_METHODS_LIST, PAYMENT_REDIRECT_NO_RESPONSE -> PaymentResult.TransactionState.PAYMENT_INCOMPLETE + PAYMENT_METHODS_LIST, PAYMENT_REDIRECT_NO_RESPONSE, SDK_CHALLENGE -> PaymentResult.TransactionState.PAYMENT_INCOMPLETE PAYMENT_SUCCESS -> PaymentResult.TransactionState.PAYMENT_SUCCESS PAYMENT_FAILURE, PAYMENT_FAILURE_WITH_RETRY -> PaymentResult.TransactionState.PAYMENT_FAILURE PAYMENT_CANCELED -> PaymentResult.TransactionState.PAYMENT_CANCELED diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/data/SessionStateRepository.kt b/monext/src/main/kotlin/com/monext/sdk/internal/data/SessionStateRepository.kt index a3ded14..4121599 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/data/SessionStateRepository.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/data/SessionStateRepository.kt @@ -1,8 +1,8 @@ package com.monext.sdk.internal.data -import android.net.Uri -import android.util.Log +import android.app.Activity import androidx.compose.runtime.staticCompositionLocalOf +import com.monext.sdk.Appearance import com.monext.sdk.internal.api.AvailableCardNetworksRequest import com.monext.sdk.internal.api.AvailableCardNetworksResponse import com.monext.sdk.internal.api.PaymentAPI @@ -12,8 +12,12 @@ import com.monext.sdk.internal.api.model.request.SecuredPaymentRequest import com.monext.sdk.internal.api.model.request.WalletPaymentRequest import com.monext.sdk.internal.api.model.response.SessionState import com.monext.sdk.internal.threeds.ThreeDSManager +import com.monext.sdk.internal.threeds.model.AuthenticationResponse +import com.monext.sdk.internal.threeds.model.ChallengeUseCaseCallback +import com.monext.sdk.internal.threeds.model.SdkChallengeData import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import java.net.URI internal class SessionStateRepository( private val paymentAPI: PaymentAPI, @@ -25,11 +29,7 @@ internal class SessionStateRepository( private var token: String? = null - val returnURLString = Uri.Builder() - .scheme("https") - .authority(internalSDKContext.environment.host) - .build() - .toString() + val returnURLString = URI("https", internalSDKContext.environment.host, null).toString() suspend fun initializeSessionState(token: String) { if (this.token == token) return @@ -82,32 +82,57 @@ internal class SessionStateRepository( } } + suspend fun makeSdkPayment(params: AuthenticationResponse) { + makeRequest { + val token = token ?: throw INVALID_TOKEN_EXCEPTION + paymentAPI.sdkPaymentRequest(token, params) + } + } + + /** + * Lance le flow Challenge + */ + suspend fun makeThreeDsChallengeFlow( + activity: Activity, + sdkChallengeData: SdkChallengeData, + theme: Appearance, + useCaseCallback: ChallengeUseCaseCallback) { + + threeDSManager.doChallengeFlow(activity, sdkChallengeData, theme, object: ChallengeUseCaseCallback { + override fun onChallengeCompletion(authenticationResponse: AuthenticationResponse) { + // Le challenge est terminé, on close la transation + threeDSManager.closeTransaction() + // On appelle la callback pour la suite du traitement. + useCaseCallback.onChallengeCompletion(authenticationResponse) + } + }) + } + suspend fun availableCardNetworks(params: AvailableCardNetworksRequest): AvailableCardNetworksResponse? { return try { val token = token ?: throw INVALID_TOKEN_EXCEPTION paymentAPI.availableCardNetworks(token, params) } catch (t: Throwable) { - Log.d("NETWORK", "==> availableCardNetworks") - Log.e("NETWORK", t.localizedMessage ?: "unknown error", t) + internalSDKContext.logger.e(TAG, "error when call availableCardNetworks ${t.localizedMessage ?: "unknown error"}", t) null } } - private suspend fun makeRequest(yield: suspend () -> SessionState) { + private suspend fun makeRequest(callback: suspend () -> SessionState) { try { - animateSessionStateChange(yield()) + animateSessionStateChange(callback()) } catch (t: Throwable) { - Log.d("NETWORK", "==> makeRequest") - Log.e("NETWORK", t.localizedMessage ?: "unknown error", t) + internalSDKContext.logger.e(TAG, "error when call makeRequest ${t.localizedMessage ?: "unknown error"}", t) } } - private fun animateSessionStateChange(sState: SessionState) { + protected fun animateSessionStateChange(sState: SessionState) { _sessionState.value = sState } companion object { val INVALID_TOKEN_EXCEPTION = RuntimeException("invalid token") + const val TAG = "SessionStateRepo" } } diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/data/sessionstate/PaymentMethodsList.kt b/monext/src/main/kotlin/com/monext/sdk/internal/data/sessionstate/PaymentMethodsList.kt index c7cf960..37e9b36 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/data/sessionstate/PaymentMethodsList.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/data/sessionstate/PaymentMethodsList.kt @@ -3,7 +3,6 @@ package com.monext.sdk.internal.data.sessionstate import android.os.Parcelable import com.monext.sdk.internal.data.PaymentMethod import com.monext.sdk.internal.data.PaymentMethod.Cards -import com.monext.sdk.internal.presentation.paymentmethods.GooglePayRequestData import kotlinx.parcelize.Parcelize import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -78,10 +77,7 @@ internal data class PaymentMethodData( val paymentMethodAction: Int?, - // ??? -// let paymentParamsToBeControlled: [Any] - - val additionalData: AdditionalData, + val additionalData: AdditionalData?, val requestContext: RequestContext?, diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/exception/ThreeDsException.kt b/monext/src/main/kotlin/com/monext/sdk/internal/exception/ThreeDsException.kt index 62b9f24..1d5ceb6 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/exception/ThreeDsException.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/exception/ThreeDsException.kt @@ -1,8 +1,5 @@ package com.monext.sdk.internal.exception -import kotlin.Throwable - - enum class ThreeDsExceptionType() { INITIALISATION_FAILED, NOT_INITIALISED, diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/presentation/PaymentContainer.kt b/monext/src/main/kotlin/com/monext/sdk/internal/presentation/PaymentContainer.kt index d230571..ccdfbd7 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/presentation/PaymentContainer.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/presentation/PaymentContainer.kt @@ -1,15 +1,16 @@ package com.monext.sdk.internal.presentation import androidx.compose.runtime.Composable +import com.monext.sdk.PaymentOverlayToggle import com.monext.sdk.PaymentResult import com.monext.sdk.PaymentResult.PaymentCompleted import com.monext.sdk.PaymentResult.TransactionState -import com.monext.sdk.internal.data.FormData -import com.monext.sdk.internal.data.PaymentMethod -import com.monext.sdk.internal.data.sessionstate.PaymentMethodsList import com.monext.sdk.internal.api.model.SessionInfo import com.monext.sdk.internal.api.model.response.SessionState import com.monext.sdk.internal.api.model.response.SessionStateType +import com.monext.sdk.internal.data.FormData +import com.monext.sdk.internal.data.PaymentMethod +import com.monext.sdk.internal.data.sessionstate.PaymentMethodsList import com.monext.sdk.internal.data.sessionstate.Wallet import com.monext.sdk.internal.presentation.status.LoadingSection import com.monext.sdk.internal.presentation.status.PaymentCanceledScreen @@ -17,6 +18,7 @@ import com.monext.sdk.internal.presentation.status.PaymentFailureScreen import com.monext.sdk.internal.presentation.status.PaymentRedirectionScreen import com.monext.sdk.internal.presentation.status.PaymentSuccessScreen import com.monext.sdk.internal.presentation.status.TokenExpiredScreen +import com.monext.sdk.internal.threeds.view.PaymentSdkChallengeScreen internal data class PaymentAttempt( val selectedPaymentMethod: PaymentMethod?, @@ -36,7 +38,8 @@ internal fun PaymentContainer( onRedirectionComplete: () -> Unit, onRetry: () -> Unit, onResult: (PaymentResult) -> Unit, - onIsShowingChange: ((Boolean) -> Unit)? = null + onIsShowingChange: ((Boolean) -> Unit)? = null, + showOverlay: (PaymentOverlayToggle) -> Unit ) { if (sessionState?.type?.isFinalState() == true) { @@ -65,7 +68,6 @@ internal fun PaymentContainer( } } - when (sessionState?.type) { SessionStateType.PAYMENT_METHODS_LIST -> { sessionState.info?.let { info -> @@ -83,19 +85,25 @@ internal fun PaymentContainer( } ?: LoadingSection() } + SessionStateType.SDK_CHALLENGE -> { + sessionState.paymentSdkChallenge?.sdkChallengeData?.let { data -> + PaymentSdkChallengeScreen(sdkChallengeData = data, showOverlay) + } ?: LoadingSection() + } + SessionStateType.PAYMENT_SUCCESS -> { sessionState.info?.let { info -> sessionState.paymentSuccess?.let { success -> - PaymentSuccessScreen(info, success) { onIsShowingChange?.invoke(false) } + PaymentSuccessScreen(info, successData = success) { onIsShowingChange?.invoke(false) } } } ?: LoadingSection() } SessionStateType.PAYMENT_FAILURE -> { PaymentFailureScreen( - sessionState.info?.formattedAmount ?: "", - onRetry = onRetry, - onExit = { onIsShowingChange?.invoke(false) }) + sessionState.info?.formattedAmount ?: "", + onRetry = onRetry, + onExit = { onIsShowingChange?.invoke(false) }) } SessionStateType.PAYMENT_CANCELED -> { diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/presentation/SessionStateViewModel.kt b/monext/src/main/kotlin/com/monext/sdk/internal/presentation/SessionStateViewModel.kt index 0a6390a..52a98da 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/presentation/SessionStateViewModel.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/presentation/SessionStateViewModel.kt @@ -2,7 +2,6 @@ package com.monext.sdk.internal.presentation import android.app.Application import android.content.Context -import android.icu.util.TimeZone import android.util.Log import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.ViewModelProvider @@ -35,7 +34,8 @@ import com.monext.sdk.internal.data.sessionstate.Wallet import com.monext.sdk.internal.presentation.paymentmethods.GooglePayRequestData import com.monext.sdk.internal.presentation.paymentmethods.GooglePayUtil import com.monext.sdk.internal.threeds.ThreeDSManager -import com.monext.sdk.internal.threeds.model.SDKContextData +import com.monext.sdk.internal.threeds.model.SdkContextData +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -45,9 +45,12 @@ import kotlinx.coroutines.tasks.await import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json import java.util.Date +import java.util.TimeZone import java.util.concurrent.TimeUnit -internal class SessionStateViewModel(val sessionStateRepository: SessionStateRepository, val app: Application): AndroidViewModel(app) { +internal class SessionStateViewModel(val sessionStateRepository: SessionStateRepository, + val app: Application, + val dispatcher: CoroutineDispatcher = Dispatchers.IO): AndroidViewModel(app) { companion object { @@ -149,7 +152,7 @@ internal class SessionStateViewModel(val sessionStateRepository: SessionStateRep /** * Fonction qui permet de traiter les paiements par Carte */ - private suspend fun makeCardPayment(paymentFormData: FormData?, context: Context, showOverlay: (PaymentOverlayToggle) -> Unit) { + internal suspend fun makeCardPayment(paymentFormData: FormData?, context: Context, showOverlay: (PaymentOverlayToggle) -> Unit) { val formData = (paymentFormData as? FormData.Card) ?: return val paymentMethod = formData.paymentMethod @@ -158,15 +161,21 @@ internal class SessionStateViewModel(val sessionStateRepository: SessionStateRep val cardType = formData.cardNetwork?.network?.name ?: cardCode.name - // On check si le 3DS est initialisé, si ce n'est pas le cas, on le fait - if(!sessionStateRepository.threeDSManager.isInitialized) { - withContext(Dispatchers.IO) { - // Blocking network request code - sessionStateRepository.threeDSManager.initialize(sessionToken = sessionState.value!!.token, cardCode = cardType) - } + // Si le 3DS est déjà initialisé, on le close pour le ré-init + if(sessionStateRepository.threeDSManager.isInitialized) { + sessionStateRepository.threeDSManager.closeTransaction() + } + + // A garder car doit etre executé dans une coroutine + withContext(dispatcher) { + // Blocking network request code + sessionStateRepository.threeDSManager.startInitialize( + sessionToken = sessionState.value!!.token, + cardCode = cardType + ) } - val sdkContextData: SDKContextData = + val sdkContextData: SdkContextData = sessionStateRepository.threeDSManager.generateSDKContextData(cardType) val displayMetrics = context.resources.displayMetrics @@ -195,7 +204,8 @@ internal class SessionStateViewModel(val sessionStateRepository: SessionStateRep securedPaymentParams = formData.securedPaymentParams() ) - showOverlay(PaymentOverlayToggle.on(formData.cardNetwork?.network ?: cardCode)) + val selectedCardNetwork = formData.cardNetwork?.network ?: cardCode + showOverlay(PaymentOverlayToggle.on(selectedCardNetwork)) sessionStateRepository.makeSecuredPayment(params) showOverlay(PaymentOverlayToggle.off()) } diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/presentation/common/FormTextField.kt b/monext/src/main/kotlin/com/monext/sdk/internal/presentation/common/FormTextField.kt index f0d6fe1..e013b97 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/presentation/common/FormTextField.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/presentation/common/FormTextField.kt @@ -2,7 +2,6 @@ package com.monext.sdk.internal.presentation.common import androidx.compose.foundation.background import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField @@ -15,16 +14,15 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldColors import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.input.ImeAction @@ -35,6 +33,7 @@ import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.monext.sdk.Appearance import com.monext.sdk.LocalAppearance import com.monext.sdk.R import com.monext.sdk.internal.data.Issuer @@ -69,25 +68,7 @@ internal fun FormTextField( val interactionSource = remember { MutableInteractionSource() } - val colors = OutlinedTextFieldDefaults.colors( - focusedTextColor = if (useOnSurfaceStyle) theme.textfieldTextOnSurfaceColor else theme.textfieldTextColor, - unfocusedTextColor = if (useOnSurfaceStyle) theme.textfieldTextOnSurfaceColor else theme.textfieldTextColor, - errorTextColor = if (useOnSurfaceStyle) theme.textfieldTextOnSurfaceColor else theme.textfieldTextColor, - - focusedContainerColor = if (useOnSurfaceStyle) theme.textfieldBackgroundOnSurfaceColor else theme.textfieldBackgroundColor, - unfocusedContainerColor = if (useOnSurfaceStyle) theme.textfieldBackgroundOnSurfaceColor else theme.textfieldBackgroundColor, - errorContainerColor = if (useOnSurfaceStyle) theme.textfieldBackgroundOnSurfaceColor else theme.textfieldBackgroundColor, - - focusedBorderColor = if (useOnSurfaceStyle) theme.textfieldBorderSelectedOnSurfaceColor else theme.textfieldBorderSelectedColor, - unfocusedBorderColor = if (useOnSurfaceStyle) theme.textfieldBorderOnSurfaceColor else theme.textfieldBorderColor, - errorBorderColor = theme.errorColor, - - focusedLabelColor = if (useOnSurfaceStyle) theme.textfieldBorderSelectedOnSurfaceColor else theme.textfieldBorderSelectedColor, - unfocusedLabelColor = if (useOnSurfaceStyle) theme.textfieldLabelOnSurfaceColor else theme.textfieldLabelColor, - errorLabelColor = theme.errorColor, - ) - -// val keyboard = LocalSoftwareKeyboardController.current + val colors = getColors(useOnSurfaceStyle, theme) val visualTransformation = VisualTransformation { TransformedText( @@ -101,99 +82,79 @@ internal fun FormTextField( val formTextStyle = theme.baseTextStyle.copy(letterSpacing = 3.sp) .foreground(colors.focusedTextColor) val formTextSize = 20.sp -// var resizedTextSize by remember { mutableStateOf(formTextSize) } -// var extraPadding by remember { mutableFloatStateOf(0f) } -// BoxWithConstraints { + BasicTextField( + value = text, + onValueChange = { text -> + val sanitized = assistant.sanitizer.sanitize(text) + val limited = assistant.charLimit?.let { + sanitized.take(it) + } ?: sanitized + onTextChanged(limited) + }, + modifier = modifier + .onFocusChanged { + isFocused = it.isFocused + errorMessage = if (!isFocused && text.isNotBlank()) { + assistant.validator?.validate(text, issuer)?.errorMessage(context) + } else { + null + } + }, + textStyle = formTextStyle.copy(fontSize = formTextSize),//.copy(fontSize = resizedTextSize), + keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, -// val outer = this -// val maxInputWidth = outer.maxWidth - 32.dp -// val maxInputWidthPx = with(LocalDensity.current) { maxInputWidth.toPx() } + singleLine = true, + visualTransformation = visualTransformation, - BasicTextField( - value = text, - onValueChange = { text -> - val sanitized = assistant.sanitizer.sanitize(text) - val limited = assistant.charLimit?.let { - sanitized.take(it) - } ?: sanitized - onTextChanged(limited) - }, - modifier = modifier - .onFocusChanged { - isFocused = it.isFocused - errorMessage = if (!isFocused && text.isNotBlank()) { - assistant.validator?.validate(text, issuer)?.errorMessage(context) - } else { - null - } + interactionSource = interactionSource, + decorationBox = { innerTextField -> + OutlinedTextFieldDefaults.DecorationBox( + value = text, + innerTextField = innerTextField, + enabled = true, + singleLine = true, + visualTransformation = visualTransformation, + interactionSource = interactionSource, + isError = isError, + label = { + Text(labelText, style = theme.baseTextStyle.s12()) }, - textStyle = formTextStyle.copy(fontSize = formTextSize),//.copy(fontSize = resizedTextSize), - keyboardOptions = keyboardOptions, - keyboardActions = keyboardActions, -// keyboardActions = KeyboardActions(onAny = { -// keyboard?.hide() -// }), - singleLine = true, - visualTransformation = visualTransformation, -// onTextLayout = { textLayoutResult -> -// if (textLayoutResult.size.width > (maxInputWidthPx - extraPadding)) { -// resizedTextSize *= 0.9 -// } -// }, - interactionSource = interactionSource, - decorationBox = { innerTextField -> - OutlinedTextFieldDefaults.DecorationBox( - value = text, - innerTextField = innerTextField, - enabled = true, - singleLine = true, - visualTransformation = visualTransformation, - interactionSource = interactionSource, - isError = isError, - label = { - Text(labelText, style = theme.baseTextStyle.s12()) - }, - trailingIcon = if (showsAccessory) { - { -// BoxWithConstraints { -// val inner = this -// val paddingPx = with(LocalDensity.current) { inner.maxWidth.toPx() } -// extraPadding = paddingPx - IconButton({ showInfoDialog = true }) { - Icon( - Icons.Default.Info, - contentDescription = null, - tint = if (useOnSurfaceStyle) theme.textfieldAccessoryOnSurfaceColor else theme.textfieldAccessoryColor - ) - } -// } - } - } else { -// extraPadding = 0f - null - }, - supportingText = { - errorMessage?.let { - Text(it, style = theme.baseTextStyle.s12()) + trailingIcon = if (showsAccessory) { + { + + IconButton({ showInfoDialog = true }) { + Icon( + Icons.Default.Info, + contentDescription = null, + tint = if (useOnSurfaceStyle) theme.textfieldAccessoryOnSurfaceColor else theme.textfieldAccessoryColor + ) } - }, - colors = colors, - container = { - OutlinedTextFieldDefaults.Container( - enabled = true, - isError = isError, - interactionSource = interactionSource, - colors = colors, - shape = RoundedCornerShape(theme.cardRadius), - focusedBorderThickness = 2.dp, - unfocusedBorderThickness = 1.dp - ) } - ) - } - ) -// } + } else { + null + }, + supportingText = { + errorMessage?.let { + Text(it, style = theme.baseTextStyle.s12()) + } + }, + colors = colors, + container = { + OutlinedTextFieldDefaults.Container( + enabled = true, + isError = isError, + interactionSource = interactionSource, + colors = colors, + shape = RoundedCornerShape(theme.cardRadius), + focusedBorderThickness = 2.dp, + unfocusedBorderThickness = 1.dp + ) + } + ) + } + ) if (showInfoDialog) { NoActionDialog( @@ -205,6 +166,28 @@ internal fun FormTextField( } } +@Composable +private fun getColors( + useOnSurfaceStyle: Boolean, + theme: Appearance +): TextFieldColors = OutlinedTextFieldDefaults.colors( + focusedTextColor = if (useOnSurfaceStyle) theme.textfieldTextOnSurfaceColor else theme.textfieldTextColor, + unfocusedTextColor = if (useOnSurfaceStyle) theme.textfieldTextOnSurfaceColor else theme.textfieldTextColor, + errorTextColor = if (useOnSurfaceStyle) theme.textfieldTextOnSurfaceColor else theme.textfieldTextColor, + + focusedContainerColor = if (useOnSurfaceStyle) theme.textfieldBackgroundOnSurfaceColor else theme.textfieldBackgroundColor, + unfocusedContainerColor = if (useOnSurfaceStyle) theme.textfieldBackgroundOnSurfaceColor else theme.textfieldBackgroundColor, + errorContainerColor = if (useOnSurfaceStyle) theme.textfieldBackgroundOnSurfaceColor else theme.textfieldBackgroundColor, + + focusedBorderColor = if (useOnSurfaceStyle) theme.textfieldBorderSelectedOnSurfaceColor else theme.textfieldBorderSelectedColor, + unfocusedBorderColor = if (useOnSurfaceStyle) theme.textfieldBorderOnSurfaceColor else theme.textfieldBorderColor, + errorBorderColor = theme.errorColor, + + focusedLabelColor = if (useOnSurfaceStyle) theme.textfieldBorderSelectedOnSurfaceColor else theme.textfieldBorderSelectedColor, + unfocusedLabelColor = if (useOnSurfaceStyle) theme.textfieldLabelOnSurfaceColor else theme.textfieldLabelColor, + errorLabelColor = theme.errorColor, +) + @Preview @Composable internal fun FormTextFieldPreview() { diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/presentation/common/PaymentMethodsScreen.kt b/monext/src/main/kotlin/com/monext/sdk/internal/presentation/common/PaymentMethodsScreen.kt index a6bf41f..8a30435 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/presentation/common/PaymentMethodsScreen.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/presentation/common/PaymentMethodsScreen.kt @@ -24,6 +24,10 @@ import com.monext.sdk.internal.presentation.wallet.WalletsView import com.monext.sdk.internal.preview.PreviewSamples import com.monext.sdk.internal.preview.PreviewWrapper +/** + * Composant qui permet d'afficher la Liste des moyens de paiement disponible à l'acheteur. + * State : PAYMENT_METHOD_LIST + */ @Composable internal fun PaymentMethodsScreen( paymentMethodsList: PaymentMethodsList, diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/preview/PaymentAPIPreview.kt b/monext/src/main/kotlin/com/monext/sdk/internal/preview/PaymentAPIPreview.kt index cace042..ef00115 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/preview/PaymentAPIPreview.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/preview/PaymentAPIPreview.kt @@ -1,6 +1,5 @@ package com.monext.sdk.internal.preview -import com.monext.sdk.internal.threeds.response.DirectoryServerSdkKeyResponse import com.monext.sdk.internal.api.AvailableCardNetworksRequest import com.monext.sdk.internal.api.AvailableCardNetworksResponse import com.monext.sdk.internal.api.PaymentAPI @@ -8,8 +7,11 @@ import com.monext.sdk.internal.api.configuration.InternalSDKContext import com.monext.sdk.internal.api.model.request.PaymentRequest import com.monext.sdk.internal.api.model.request.SecuredPaymentRequest import com.monext.sdk.internal.api.model.request.WalletPaymentRequest -import com.monext.sdk.internal.data.sessionstate.PaymentMethodCardCode import com.monext.sdk.internal.api.model.response.SessionState +import com.monext.sdk.internal.data.sessionstate.PaymentMethodCardCode +import com.monext.sdk.internal.threeds.model.AuthenticationResponse +import com.monext.sdk.internal.threeds.response.DirectoryServerSdkKey +import com.monext.sdk.internal.threeds.response.DirectoryServerSdkKeyResponse internal object PaymentAPIPreviewSuccess: PaymentAPI { override suspend fun stateCurrent(sessionToken: String): SessionState = PreviewSamples.sessionStatePaymentMethodsList @@ -25,9 +27,21 @@ internal object PaymentAPIPreviewSuccess: PaymentAPI { selectedContractNumber = "FAKE_CONTRACT" ) - override suspend fun fetchDirectoryServerSdkKeys(sessionToken: String): DirectoryServerSdkKeyResponse { - TODO("Not yet implemented") - } + override suspend fun fetchDirectoryServerSdkKeys(sessionToken: String): DirectoryServerSdkKeyResponse = + DirectoryServerSdkKeyResponse( + arrayOf( + DirectoryServerSdkKey(scheme = "CB", + rid = "A000000042", + publicKey = "aaaaaa", + rootPublicKey = "bbbbbb") + ) + ) + + override suspend fun sdkPaymentRequest( + sessionToken: String, + params: AuthenticationResponse + ): SessionState = PreviewSamples.sessionStateSuccess + override fun updateContext(context: InternalSDKContext) {} } \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/preview/SessionStateSample.kt b/monext/src/main/kotlin/com/monext/sdk/internal/preview/SessionStateSample.kt index 1ef123c..643a4f3 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/preview/SessionStateSample.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/preview/SessionStateSample.kt @@ -341,23 +341,5 @@ internal interface PreviewSamples { isCompletionMethod = true ) ) - - val sessionStateRedirect = SessionState( - token = "fake_token", - type = SessionStateType.PAYMENT_REDIRECT_NO_RESPONSE, - creationDate = "Tue Mar 25 12:33:22 CET 2025", - cancelUrl = "https://yourdomain.com:8080/route/1.0/returns?paylinetoken=fake_token", - pointOfSale = "POS_Fake", - language = "en", - returnUrl = "https://yourdomain.com:8080/route/1.0/returns?paylinetoken=fake_token", - automaticRedirectAtSessionsEnd = false, - info = sessionInfo, - pointOfSaleAddress = posAddress, - isSandbox = true, - paymentMethodsList = null, - paymentRedirectNoResponse = paymentRedirectNoResponse, - paymentSuccess = null, - paymentFailure = null - ) } } \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/CustomChallengeStatusReceiver.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/CustomChallengeStatusReceiver.kt new file mode 100644 index 0000000..0a95120 --- /dev/null +++ b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/CustomChallengeStatusReceiver.kt @@ -0,0 +1,54 @@ +package com.monext.sdk.internal.threeds + +import com.monext.sdk.internal.service.Logger +import com.monext.sdk.internal.threeds.model.ChallengeUseCaseCallback +import com.monext.sdk.internal.threeds.model.SdkChallengeData +import com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver +import com.netcetera.threeds.sdk.api.transaction.challenge.events.CompletionEvent +import com.netcetera.threeds.sdk.api.transaction.challenge.events.ProtocolErrorEvent +import com.netcetera.threeds.sdk.api.transaction.challenge.events.RuntimeErrorEvent + +/** + * Classe qui permet d'écouter les évènement reçus par le SDK 3DS. + * Dans tous les cas, on délègue la gestion du résultat à Payline => on envoi toujours la requete de paiement. + * C'est Payline, qui en fonction du statut fera une trs OK/KO. + */ +internal class CustomChallengeStatusReceiver(val logger: Logger, + val sdkChallengeData: SdkChallengeData, + val useCaseCallback: ChallengeUseCaseCallback) : ChallengeStatusReceiver { + + override fun completed(p0: CompletionEvent?) { + logger.d("CustomChallengeStatusReceiver", "Challenge completed ! => ${p0.toString()}") + useCaseCallback.onChallengeCompletion(sdkChallengeData.toAuthenticationResponse(p0?.transactionStatus)) + } + + override fun cancelled() { + logger.d("CustomChallengeStatusReceiver", "Challenge cancelled !") + useCaseCallback.onChallengeCompletion(sdkChallengeData.toAuthenticationResponse()) + } + + override fun timedout() { + logger.w("CustomChallengeStatusReceiver", "Challenge timedout !") + useCaseCallback.onChallengeCompletion(sdkChallengeData.toAuthenticationResponse()) + } + + override fun protocolError(p0: ProtocolErrorEvent?) { + val headerMessage = "Challenge failed from ProtocolErrorEvent => errorCode: ${p0?.errorMessage?.errorCode} - " + + "errorDetails: ${p0?.errorMessage?.errorDetails} - " + + "errorDescription: ${p0?.errorMessage?.errorDescription} - " + + "errorComponent: ${p0?.errorMessage?.errorComponent} - " + + "errorMessageType:${p0?.errorMessage?.errorMessageType} - " + + "messageVersion: ${p0?.errorMessage?.messageVersionNumber}" + + logger.e("CustomChallengeStatusReceiver", headerMessage) + useCaseCallback.onChallengeCompletion(sdkChallengeData.toAuthenticationResponse()) + } + + override fun runtimeError(p0: RuntimeErrorEvent?) { + + val headerMessage = "Challenge failed from RuntimeErrorEvent => errorCode: ${p0?.errorCode} - errorMessage:${p0?.errorMessage}" + + logger.e("CustomChallengeStatusReceiver", headerMessage) + useCaseCallback.onChallengeCompletion(sdkChallengeData.toAuthenticationResponse()) + } +} \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/ThreeDSBusiness.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/ThreeDSBusiness.kt new file mode 100644 index 0000000..e057b89 --- /dev/null +++ b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/ThreeDSBusiness.kt @@ -0,0 +1,32 @@ +package com.monext.sdk.internal.threeds + +import ThreeDSConfiguration +import com.monext.sdk.internal.threeds.response.DirectoryServerSdkKey +import com.netcetera.threeds.sdk.api.configparameters.builder.ConfigurationBuilder +import com.netcetera.threeds.sdk.api.configparameters.builder.SchemeConfiguration +import java.util.Collections + +internal class ThreeDSBusiness { + + internal fun createSchemeConfiguration( + key: DirectoryServerSdkKey, + schemeLogo: String + ): SchemeConfiguration = + SchemeConfiguration.newSchemeConfiguration(convertValueIfCB(key.scheme)) + .ids(Collections.singletonList(key.rid)) + .encryptionPublicKey(key.publicKey, null) + .rootPublicKey(key.rootPublicKey) + .logo(schemeLogo) + .build() + + /** + * Fonction qui permet d'initier la configuration + */ + internal fun createConfigParameters(): ConfigurationBuilder = ThreeDSConfiguration.createConfigParameters() + /** + * Fonction qui converti notre carType "CB" en "cartesBancaires" pour la compatibilité du SDK 3DS + */ + internal fun convertValueIfCB(value:String): String { + return if(value.equals("CB", ignoreCase = true)) "cartesBancaires" else value + } +} \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/ThreeDSManager.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/ThreeDSManager.kt index a483ef5..3dccd45 100644 --- a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/ThreeDSManager.kt +++ b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/ThreeDSManager.kt @@ -1,32 +1,43 @@ package com.monext.sdk.internal.threeds import ThreeDSConfiguration +import android.app.Activity import android.content.Context -import android.util.Base64 +import com.monext.sdk.Appearance +import com.monext.sdk.R +import com.monext.sdk.internal.api.PaymentAPI +import com.monext.sdk.internal.api.configuration.InternalSDKContext +import com.monext.sdk.internal.exception.ThreeDsException +import com.monext.sdk.internal.exception.ThreeDsExceptionType +import com.monext.sdk.internal.threeds.model.ChallengeUseCaseCallback +import com.monext.sdk.internal.threeds.model.SdkChallengeData +import com.monext.sdk.internal.threeds.model.SdkContextData import com.netcetera.threeds.sdk.ThreeDS2ServiceInstance import com.netcetera.threeds.sdk.api.ThreeDS2Service import com.netcetera.threeds.sdk.api.configparameters.ConfigParameters import com.netcetera.threeds.sdk.api.configparameters.builder.ConfigurationBuilder import com.netcetera.threeds.sdk.api.configparameters.builder.SchemeConfiguration import com.netcetera.threeds.sdk.api.exceptions.SDKNotInitializedException +import com.netcetera.threeds.sdk.api.transaction.Transaction +import com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeParameters +import com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeStatusReceiver import com.netcetera.threeds.sdk.api.ui.logic.UiCustomization -import com.monext.sdk.R -import com.monext.sdk.internal.api.PaymentAPI -import com.monext.sdk.internal.api.configuration.InternalSDKContext -import com.monext.sdk.internal.threeds.model.SDKContextData -import com.monext.sdk.internal.exception.ThreeDsException -import com.monext.sdk.internal.exception.ThreeDsExceptionType +import kotlinx.coroutines.delay +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json import org.json.JSONException -import org.json.JSONObject -import java.util.Collections +import java.util.Base64 + internal class ThreeDSManager (val paymentApi: PaymentAPI, var internalSDKContext: InternalSDKContext, - var context: Context){ - - lateinit var threeDS2Service : ThreeDS2Service + var context: Context, + val threeDS2ServiceProvided : ThreeDS2Service? = null, // Injection du Service pour les Tests... Pas trouvé d'autre solution... + val threeDSBusiness: ThreeDSBusiness = ThreeDSBusiness()) { - var isInitialized = false + internal var threeDS2Service : ThreeDS2Service? = null + internal var currentOnGoingThreeDsTransaction: Transaction? = null + internal var isInitialized = false companion object { const val TAG: String = "ThreeDSManager" @@ -34,28 +45,13 @@ internal class ThreeDSManager (val paymentApi: PaymentAPI, } /** - * Fonction qui permet d'afficher les Warning du SDK 3DS + * Focntion qui permet d'initialiser la configuration du SDK 3DS */ - private fun loadWarnings() { - try { - val warnings = threeDS2Service.warnings - for (warn in warnings) { - internalSDKContext.logger.w(TAG, " [3DS-WARN] => [${warn.severity}] - ${warn.message}") - } - // Handle warnings - } catch (e: SDKNotInitializedException) { - // ... - // TODO : Gérer les erreurs - } - } - - suspend fun initialize(sessionToken: String, cardCode: String) { - + internal suspend fun startInitialize(sessionToken: String, cardCode: String) { try { - val uiCustomization = - ThreeDSUICustomization.createUICustomization(internalSDKContext) + val uiCustomization = ThreeDSUICustomization.createUICustomization(internalSDKContext) - val configurationBuilder = ThreeDSConfiguration.createConfigParameters() + val configurationBuilder = threeDSBusiness.createConfigParameters() completeSchemeConfiguration(configurationBuilder, cardCode, sessionToken) val configParameters: ConfigParameters = configurationBuilder.build() @@ -66,8 +62,8 @@ internal class ThreeDSManager (val paymentApi: PaymentAPI, UiCustomization.UiCustomizationType.MONOCHROME to uiCustomization ) - threeDS2Service = ThreeDS2ServiceInstance.get() - threeDS2Service.initialize( + threeDS2Service = getThreeDS2ServiceInstance() + threeDS2Service!!.initialize( context, configParameters, locale, @@ -106,62 +102,93 @@ internal class ThreeDSManager (val paymentApi: PaymentAPI, } + internal fun getThreeDS2ServiceInstance(): ThreeDS2Service { + // Si le service est fournit pour les Tests, on le prends, sinon on récupère une instace via 'ThreeDS2ServiceInstance' + return threeDS2ServiceProvided ?: ThreeDS2ServiceInstance.get() + } + /** - * Fonction qui permet de récupérer la liste des schemes à partir du serveur. - * En SANDBOX uniquement. + * Fonction qui permet de collecter les donneés de context 3DS pour les envoyer côté Serveur */ - private suspend fun fetchSchemesFromServer(sessionToken: String) : List { - val response = paymentApi.fetchDirectoryServerSdkKeys(sessionToken) + internal fun generateSDKContextData(cardType: String) : SdkContextData { + if(!isInitialized) { + throw ThreeDsException(ThreeDsExceptionType.NOT_INITIALISED, "Unable to generate 3DS Context") + } - val schemes = mutableListOf(); - for(key in response.directoryServerSdkKeyList) { + try { + val directoryServerID : String = getDSIdForCardType(cardType) + currentOnGoingThreeDsTransaction = threeDS2Service!!.createTransaction(directoryServerID, ThreeDSConfiguration.MESSAGE_VERSION) - if (SUPPORTED_CARD_TYPE.any {it.equals(key.scheme, ignoreCase = true)}) { - val schemeLogo = getSchemeLogo(key.scheme) - schemes.add( - SchemeConfiguration.newSchemeConfiguration(convertValueIfCB(key.scheme)) - .ids(Collections.singletonList(key.rid)) - .encryptionPublicKey(key.publicKey, null) - .rootPublicKey(key.rootPublicKey) - .logo(schemeLogo) - .build() - ) - } - } + // Récupération des données du SDK 3DS + val authenticationRequestParameters = currentOnGoingThreeDsTransaction!!.authenticationRequestParameters + val ephemPubKey = transformDeviceData(authenticationRequestParameters.sdkEphemeralPublicKey) - return schemes - } + return SdkContextData( + deviceRenderingOptionsIF= ThreeDSConfiguration.DEFAULT_DEVICE_RENDERING_OPTIONS_IF, + deviceRenderOptionsUI= ThreeDSConfiguration.DEFAULT_DEVICE_RENDER_OPTIONS_UI, + maxTimeout= ThreeDSConfiguration.MAX_TIMEOUT, + referenceNumber= authenticationRequestParameters.sdkReferenceNumber, + ephemPubKey= ephemPubKey, + appID= authenticationRequestParameters.sdkAppID, + transID= authenticationRequestParameters.sdkTransactionID, + encData= authenticationRequestParameters.deviceData + ) - /** - * Fonction qui converti notre carType "CB" en "cartesBancaires" pour la compatibilité du SDK 3DS - */ - private fun convertValueIfCB(value:String): String { - return if(value.equals("CB", ignoreCase = true)) "cartesBancaires" else value + } catch (exception : Exception) { + throw ThreeDsException(ThreeDsExceptionType.THREE_DS_KEY_ERROR, "Unable to get contextData card type: $cardType", exception) + } } /** - * Récupère les logos définit dans les resources du projet + * Fonction qui permet de déclencher le Challenge Flow */ - private fun getSchemeLogo(cardType: String) : String { + internal suspend fun doChallengeFlow(activity: Activity, + sdkChallengeData: SdkChallengeData, + theme: Appearance, + useCaseCallback: ChallengeUseCaseCallback) { + try { + if(!isInitialized || currentOnGoingThreeDsTransaction == null) { + throw ThreeDsException(ThreeDsExceptionType.NOT_INITIALISED, "Unable to start 3DS Challenge Flow") + } - return when (cardType) { - "CB", "cb" -> R.drawable.logo_cb.toString() - "VISA", "visa"-> R.drawable.logo_visa.toString() - "MASTERCARD", "mastercard" -> R.drawable.logo_mastercard.toString() - "AMEX", "amex" -> R.drawable.logo_amex.toString() - else -> throw ThreeDsException(ThreeDsExceptionType.UNSUPPORTED_NETWORK, "Unsupported card type: $cardType") + val challengeParameters : ChallengeParameters = sdkChallengeData.toSdkChallengeParameters() + val challengeStatusReceiver : ChallengeStatusReceiver = + CustomChallengeStatusReceiver( + logger = internalSDKContext.logger, + sdkChallengeData = sdkChallengeData, + useCaseCallback = useCaseCallback) + + val timeOut = 10 + val progressView = currentOnGoingThreeDsTransaction!!.getProgressView(activity) + progressView.showProgress() + delay(2000L) + + currentOnGoingThreeDsTransaction!!.doChallenge(activity, challengeParameters, challengeStatusReceiver, timeOut); + + } catch (exception : Exception) { + internalSDKContext.logger.e(TAG,"Unable to start 3DS Challenge Flow with threeDSServerTransID : $sdkChallengeData.threeDSServerTransID", exception) + // On appelle quand meme le service de paiement pour générer une TRS KO + useCaseCallback.onChallengeCompletion(sdkChallengeData.toAuthenticationResponse()) } } - private fun getSchemeForCardCode(cardType: String) : SchemeConfiguration { + /** + * Close and cleanup 3DS context + */ + internal fun closeTransaction() { + try { + if (currentOnGoingThreeDsTransaction != null) { + currentOnGoingThreeDsTransaction!!.close() + currentOnGoingThreeDsTransaction = null + } - return when (cardType) { - "CB" -> SchemeConfiguration.cbConfiguration().build() - "VISA"-> SchemeConfiguration.visaSchemeConfiguration().build() - "MASTERCARD" -> SchemeConfiguration.mastercardSchemeConfiguration().build() - "AMEX" -> SchemeConfiguration.amexConfiguration().build() - else -> throw ThreeDsException(ThreeDsExceptionType.UNSUPPORTED_NETWORK, "Unsupported card code: $cardType") - } as SchemeConfiguration + if (threeDS2Service != null) { + threeDS2Service!!.cleanup(context) + } + } catch (exception : Exception) { + // Possible Exception lors du clean si le sdk n'est pas initialisé, mais ce n'est pas grave ici : SDKNotInitializedException + internalSDKContext.logger.e(TAG,"closeTransaction", exception) + } } /** @@ -170,11 +197,11 @@ internal class ThreeDSManager (val paymentApi: PaymentAPI, * - Pour la PROD tout est fait dans le SDK... */ @Throws(ThreeDsException::class) - suspend fun completeSchemeConfiguration(configurationBuilder: ConfigurationBuilder, cardType: String, sessionToken: String) { + private suspend fun completeSchemeConfiguration(configurationBuilder: ConfigurationBuilder, cardType: String, sessionToken: String) { if (internalSDKContext.environment.isSandbox()) { val schemesFromServer = fetchSchemesFromServer(sessionToken) - val valueToCheck = convertValueIfCB(cardType) - val schemeConfiguration = schemesFromServer.find { it.schemeName == valueToCheck } + val valueToCheck = threeDSBusiness.convertValueIfCB(cardType) + val schemeConfiguration = schemesFromServer.find { it.schemeName.equals(valueToCheck, ignoreCase = true) } if(schemeConfiguration == null) { throw ThreeDsException(ThreeDsExceptionType.UNSUPPORTED_NETWORK, "Unable to find scheme for card type: $cardType") } @@ -185,42 +212,52 @@ internal class ThreeDSManager (val paymentApi: PaymentAPI, } } - /** - * Fonction qui permet de collecter les donneés de context 3DS + * Fonction qui permet de récupérer la liste des schemes à partir du serveur. + * En SANDBOX uniquement. */ - fun generateSDKContextData(cardType: String) : SDKContextData { - if(!isInitialized) { - throw ThreeDsException(ThreeDsExceptionType.NOT_INITIALISED, "Unable to generate 3DS Context") - } + private suspend fun fetchSchemesFromServer(sessionToken: String) : List { + val response = paymentApi.fetchDirectoryServerSdkKeys(sessionToken) - try { - val directoryServerID : String = getDSIdForCardType(cardType) - val transaction = threeDS2Service.createTransaction(directoryServerID, ThreeDSConfiguration.MESSAGE_VERSION) + val schemes = mutableListOf(); + for(key in response.directoryServerSdkKeyList) { - val authenticationRequestParameters = transaction.authenticationRequestParameters - val ephemPubKey = - transformDeviceData(authenticationRequestParameters.sdkEphemeralPublicKey) + if (SUPPORTED_CARD_TYPE.any {it.equals(key.scheme, ignoreCase = true)}) { + val schemeLogo = getSchemeLogo(key.scheme) + schemes.add(threeDSBusiness.createSchemeConfiguration(key, schemeLogo)) + } + } - return SDKContextData( - deviceRenderingOptionsIF= ThreeDSConfiguration.DEFAULT_DEVICE_RENDERING_OPTIONS_IF, - deviceRenderOptionsUI= ThreeDSConfiguration.DEFAULT_DEVICE_RENDER_OPTIONS_UI, - maxTimeout= ThreeDSConfiguration.MAX_TIMEOUT, - referenceNumber= authenticationRequestParameters.sdkReferenceNumber, - ephemPubKey= ephemPubKey, - appID= authenticationRequestParameters.sdkAppID, - transID= authenticationRequestParameters.sdkTransactionID, - encData= authenticationRequestParameters.deviceData - ) + return schemes + } - } catch (exception : Exception) { - throw ThreeDsException(ThreeDsExceptionType.THREE_DS_KEY_ERROR, "Unable to get contextData card type: $cardType", exception) + /** + * Récupère les logos définit dans les resources du projet + */ + private fun getSchemeLogo(cardType: String) : String { + + return when (cardType) { + "CB", "cb" -> R.drawable.logo_cb.toString() + "VISA", "visa"-> R.drawable.logo_visa.toString() + "MASTERCARD", "mastercard" -> R.drawable.logo_mastercard.toString() + "AMEX", "amex" -> R.drawable.logo_amex.toString() + else -> throw ThreeDsException(ThreeDsExceptionType.UNSUPPORTED_NETWORK, "Unsupported card type: $cardType") } + } + private fun getSchemeForCardCode(cardType: String) : SchemeConfiguration { + + return when (cardType) { + "CB" -> SchemeConfiguration.cbConfiguration().build() + "VISA"-> SchemeConfiguration.visaSchemeConfiguration().build() + "MASTERCARD" -> SchemeConfiguration.mastercardSchemeConfiguration().build() + "AMEX" -> SchemeConfiguration.amexConfiguration().build() + else -> throw ThreeDsException(ThreeDsExceptionType.UNSUPPORTED_NETWORK, "Unsupported card code: $cardType") + } as SchemeConfiguration } private fun getDSIdForCardType(cardType: String): String { - val schemeConfiguration = threeDS2Service.sdkInfo.schemeConfigurations.find { it.name == convertValueIfCB(cardType) } + val schemeConfiguration = threeDS2Service!!.sdkInfo.schemeConfigurations.find { it.name.equals(threeDSBusiness.convertValueIfCB(cardType), ignoreCase = true) } if(schemeConfiguration == null) { throw ThreeDsException(ThreeDsExceptionType.UNSUPPORTED_NETWORK, "Unable to find scheme for card type: $cardType") } @@ -231,14 +268,18 @@ internal class ThreeDSManager (val paymentApi: PaymentAPI, return dsId } - fun transformDeviceData(deviceData: String): String { + @JvmRecord + @Serializable + data class EphemeralKey(val kty: String, val crv: String, val x: String, val y: String) + + private fun transformDeviceData(deviceData: String): String { try { - val jwk = JSONObject(deviceData) + val jwk = Json.decodeFromString(deviceData) - val kty = jwk.optString("kty", "") - val crv = jwk.optString("crv", "") - val xCoord = jwk.optString("x", "") - val yCoord = jwk.optString("y", "") + val kty = jwk.kty + val crv = jwk.crv + val xCoord = jwk.x + val yCoord = jwk.y if (kty.isEmpty() || crv.isEmpty() || xCoord.isEmpty() || yCoord.isEmpty()) { throw ThreeDsException(ThreeDsExceptionType.THREE_DS_KEY_ERROR, "Clés JWK manquantes (kty, crv, x, y)") @@ -252,31 +293,31 @@ internal class ThreeDSManager (val paymentApi: PaymentAPI, val yBase64 = yCoord.base64URLToBase64() val xData = try { - Base64.decode(xBase64, Base64.DEFAULT) + Base64.getDecoder().decode(xBase64) } catch (e: IllegalArgumentException) { throw ThreeDsException(ThreeDsExceptionType.THREE_DS_KEY_ERROR,"Impossible de décoder la coordonnée x en base64", e) } val yData = try { - Base64.decode(yBase64, Base64.DEFAULT) + Base64.getDecoder().decode(yBase64) } catch (e: IllegalArgumentException) { throw ThreeDsException(ThreeDsExceptionType.THREE_DS_KEY_ERROR,"Impossible de décoder la coordonnée y en base64", e) } - val xFinal = Base64.encodeToString(xData, Base64.NO_WRAP) + val xFinal = Base64.getEncoder().encodeToString(xData) .replace("+", "-") .replace("/", "_") .replace("=", "") - val yFinal = Base64.encodeToString(yData, Base64.NO_WRAP) + val yFinal = Base64.getEncoder().encodeToString(yData) .replace("+", "-") .replace("/", "_") .replace("=", "") return "$crv;$kty;$xFinal;$yFinal" - } catch (e: JSONException) { - throw ThreeDsException(ThreeDsExceptionType.THREE_DS_KEY_ERROR,"Format JSON invalide") + } catch (exception: JSONException) { + throw ThreeDsException(ThreeDsExceptionType.THREE_DS_KEY_ERROR,"Format JSON invalide", cause = exception) } } @@ -293,10 +334,10 @@ internal class ThreeDSManager (val paymentApi: PaymentAPI, return base64 } - private fun displaySdkInfo() { - internalSDKContext.logger.d(TAG, "SDK License Expiry Date: ${threeDS2Service.sdkInfo.licenseExpiryDate}") - internalSDKContext.logger.d(TAG, "Supported Protocol Versions: ${threeDS2Service.sdkInfo.supportedProtocolVersions.joinToString(", ")}") - for (schemeInfo in threeDS2Service.sdkInfo.schemeConfigurations) { + internal fun displaySdkInfo() { + internalSDKContext.logger.d(TAG, "SDK License Expiry Date: ${threeDS2Service!!.sdkInfo.licenseExpiryDate}") + internalSDKContext.logger.d(TAG, "Supported Protocol Versions: ${threeDS2Service!!.sdkInfo.supportedProtocolVersions.joinToString(", ")}") + for (schemeInfo in threeDS2Service!!.sdkInfo.schemeConfigurations) { internalSDKContext.logger.d(TAG, "-------------------------------------------------------") internalSDKContext.logger.d(TAG, "Scheme: ${schemeInfo.name}") internalSDKContext.logger.d(TAG, "Scheme IDs: ${schemeInfo.ids}") @@ -314,4 +355,19 @@ internal class ThreeDSManager (val paymentApi: PaymentAPI, internalSDKContext.logger.d(TAG, "-------------------------------------------------------") } } + + /** + * Fonction qui permet d'afficher les Warning du SDK 3DS + */ + private fun loadWarnings() { + try { + val warnings = threeDS2Service!!.warnings + for (warn in warnings) { + internalSDKContext.logger.w(TAG, " [3DS-WARN] => [${warn.severity}] - ${warn.message}") + } + // Handle warnings + } catch (e: SDKNotInitializedException) { + // Pas d'erreur ici ... + } + } } \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/AuthenticationResponse.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/AuthenticationResponse.kt new file mode 100644 index 0000000..36fa6ea --- /dev/null +++ b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/AuthenticationResponse.kt @@ -0,0 +1,15 @@ +package com.monext.sdk.internal.threeds.model + +import kotlinx.serialization.Serializable + +/** + * Classe qui représente la reponse du challenge sdk 3DS + */ +@Serializable +internal data class AuthenticationResponse ( + val acsReferenceNumber: String? = null, + val acsTransID: String? = null, + val threeDSVersion: String? = null, + val threeDSServerTransID: String? = null, + val transStatus: String? = null +) diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/ChallengeUseCaseCallback.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/ChallengeUseCaseCallback.kt new file mode 100644 index 0000000..86eb50b --- /dev/null +++ b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/ChallengeUseCaseCallback.kt @@ -0,0 +1,11 @@ +package com.monext.sdk.internal.threeds.model + +internal fun interface ChallengeUseCaseCallback { + + /** + * Called on [AuthenticationResponse] change. + * + * @param authenticationResponse [AuthenticationResponse] + */ + fun onChallengeCompletion(authenticationResponse: AuthenticationResponse) +} \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/PaymentSdkChallenge.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/PaymentSdkChallenge.kt new file mode 100644 index 0000000..a1d1156 --- /dev/null +++ b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/PaymentSdkChallenge.kt @@ -0,0 +1,9 @@ +package com.monext.sdk.internal.threeds.model + +import kotlinx.serialization.Serializable + +/** + * Classe qui représente les données de context 3DS renvoyées par Payline. + */ +@Serializable +internal data class PaymentSdkChallenge(val sdkChallengeData: SdkChallengeData) \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SDKContextData.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SDKContextData.kt deleted file mode 100644 index 803278b..0000000 --- a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SDKContextData.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.monext.sdk.internal.threeds.model - -import kotlinx.serialization.Serializable - -/** - * Classse qui représente les données de context 3DS collectées sur le device. - */ -@Serializable -internal data class SDKContextData(val deviceRenderingOptionsIF: String, - val deviceRenderOptionsUI: String, - val maxTimeout: Int, - val referenceNumber: String, - val ephemPubKey: String, - val appID: String, - val transID: String, - val encData: String) \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SdkChallengeData.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SdkChallengeData.kt new file mode 100644 index 0000000..81e038d --- /dev/null +++ b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SdkChallengeData.kt @@ -0,0 +1,48 @@ +package com.monext.sdk.internal.threeds.model + +import com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeParameters +import kotlinx.serialization.Serializable + +/** + * Classe qui représente les données de context 3DS renvoyées par Payline. + */ +@Serializable +internal data class SdkChallengeData(val cardType: Int, + val threeDSServerTransID: String, + val threeDSVersion: String, + val authenticationType: String, + val transStatus: String? = "", + val sdkTransID: String, + val dsTransID: String, + val acsTransID: String? = "", + val acsRenderingType: String, + val acsReferenceNumber: String, + val acsSignedContent: String, + val acsOperatorID: String, + val acsChallengeMandated: String) { + + /** + * Crée un objet ChallengeParameters à partir des données SDK Challenge + */ + fun toSdkChallengeParameters() : ChallengeParameters { + val challengeParameters = ChallengeParameters() + challengeParameters.set3DSServerTransactionID(threeDSServerTransID) + challengeParameters.acsTransactionID = acsTransID + challengeParameters.acsRefNumber = acsReferenceNumber + challengeParameters.acsSignedContent = acsSignedContent + return challengeParameters + } + + /** + * Crée un objet AuthenticationResponse à partir des données SDK Challenge + */ + fun toAuthenticationResponse(transactionStatus: String? = null) : AuthenticationResponse { + return AuthenticationResponse( + acsReferenceNumber = acsReferenceNumber, + acsTransID = acsTransID, + threeDSVersion = threeDSVersion, + threeDSServerTransID = threeDSServerTransID, + transStatus = transactionStatus + ) + } +} \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SdkContextData.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SdkContextData.kt new file mode 100644 index 0000000..c67e1f1 --- /dev/null +++ b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/model/SdkContextData.kt @@ -0,0 +1,16 @@ +package com.monext.sdk.internal.threeds.model + +import kotlinx.serialization.Serializable + +/** + * Classse qui représente les données de context 3DS collectées sur le device. + */ +@Serializable +internal data class SdkContextData(val deviceRenderingOptionsIF: String, + val deviceRenderOptionsUI: String, + val maxTimeout: Int, + val referenceNumber: String, + val ephemPubKey: String, + val appID: String, + val transID: String, + val encData: String) \ No newline at end of file diff --git a/monext/src/main/kotlin/com/monext/sdk/internal/threeds/view/PaymentSdkChallengeScreen.kt b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/view/PaymentSdkChallengeScreen.kt new file mode 100644 index 0000000..7c98c34 --- /dev/null +++ b/monext/src/main/kotlin/com/monext/sdk/internal/threeds/view/PaymentSdkChallengeScreen.kt @@ -0,0 +1,53 @@ +package com.monext.sdk.internal.threeds.view + +import androidx.activity.compose.LocalActivity +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import com.monext.sdk.LocalAppearance +import com.monext.sdk.PaymentOverlayToggle +import com.monext.sdk.internal.data.LocalSessionStateRepo +import com.monext.sdk.internal.threeds.model.AuthenticationResponse +import com.monext.sdk.internal.threeds.model.ChallengeUseCaseCallback +import com.monext.sdk.internal.threeds.model.SdkChallengeData +import kotlinx.coroutines.launch + +/** + * Composant qui permet d'afficher la page de challenge du SDK 3DS + * State : SDK_CHALLENGE + */ +@Composable +internal fun PaymentSdkChallengeScreen(sdkChallengeData: SdkChallengeData, showOverlay: (PaymentOverlayToggle) -> Unit) { + + val scope = rememberCoroutineScope() + val theme = LocalAppearance.current + val sessionStateRepository = LocalSessionStateRepo.current + val activity = LocalActivity.current + + LaunchedEffect(Unit) { + sessionStateRepository.makeThreeDsChallengeFlow( + activity = activity!!, + sdkChallengeData = sdkChallengeData, + theme = theme, + object: ChallengeUseCaseCallback { + override fun onChallengeCompletion(authenticationResponse: AuthenticationResponse) { + scope.launch { + showOverlay(PaymentOverlayToggle.on()) + sessionStateRepository.makeSdkPayment(authenticationResponse) + showOverlay(PaymentOverlayToggle.off()) + } + } + } + ) + } + + Box(Modifier + .fillMaxSize() + .background(theme.backgroundColor)) { + } + +} \ No newline at end of file diff --git a/monext/src/test/kotlin/com/monext/sdk/SdkTestHelper.kt b/monext/src/test/kotlin/com/monext/sdk/SdkTestHelper.kt new file mode 100644 index 0000000..59bede2 --- /dev/null +++ b/monext/src/test/kotlin/com/monext/sdk/SdkTestHelper.kt @@ -0,0 +1,207 @@ +package com.monext.sdk + +import com.monext.sdk.internal.api.AvailableCardNetworksRequest +import com.monext.sdk.internal.api.AvailableCardNetworksResponse +import com.monext.sdk.internal.api.HandledContract +import com.monext.sdk.internal.api.configuration.InternalSDKContext +import com.monext.sdk.internal.api.model.DeviceInfo +import com.monext.sdk.internal.api.model.request.PaymentParams +import com.monext.sdk.internal.api.model.request.PaymentRequest +import com.monext.sdk.internal.api.model.request.SecuredPaymentParams +import com.monext.sdk.internal.api.model.request.SecuredPaymentRequest +import com.monext.sdk.internal.api.model.request.WalletPaymentRequest +import com.monext.sdk.internal.data.CardNetwork +import com.monext.sdk.internal.data.FormData +import com.monext.sdk.internal.data.PaymentMethod +import com.monext.sdk.internal.data.sessionstate.PaymentMethodCardCode +import com.monext.sdk.internal.data.sessionstate.PaymentMethodData +import com.monext.sdk.internal.presentation.PaymentAttempt +import com.monext.sdk.internal.service.CustomLogger +import com.monext.sdk.internal.threeds.model.AuthenticationResponse +import com.monext.sdk.internal.threeds.model.SdkChallengeData +import com.monext.sdk.internal.threeds.model.SdkContextData +import com.monext.sdk.internal.threeds.response.DirectoryServerSdkKey +import com.monext.sdk.internal.threeds.response.DirectoryServerSdkKeyResponse +import io.mockk.mockk +import kotlinx.serialization.json.Json + +/** + * Helper pour la construction des données de test + */ +class SdkTestHelper { + companion object { + + private val json = Json { + ignoreUnknownKeys = true + isLenient = true + explicitNulls = false + encodeDefaults = true + } + + internal fun createSdkChallengeData(): SdkChallengeData = SdkChallengeData( + cardType = 1, + threeDSServerTransID = "threeDSServerTransID", + threeDSVersion = "threeDSVersion", + authenticationType = "authenticationType", + transStatus = "transStatus", + sdkTransID = "sdkTransID", + dsTransID = "dsTransID", + acsTransID = "acsTransID", + acsRenderingType = "acsRenderingType", + acsReferenceNumber = "acsReferenceNumber", + acsSignedContent = "acsSignedContent", + acsOperatorID = "acsOperatorID", + acsChallengeMandated = "acsChallengeMandated" + ) + + internal fun createSdkContextData(): SdkContextData = SdkContextData( + deviceRenderingOptionsIF= ThreeDSConfiguration.DEFAULT_DEVICE_RENDERING_OPTIONS_IF, + deviceRenderOptionsUI= ThreeDSConfiguration.DEFAULT_DEVICE_RENDER_OPTIONS_UI, + maxTimeout= ThreeDSConfiguration.MAX_TIMEOUT, + referenceNumber= "refNumber_xx", + ephemPubKey= "ephemPubKey_yyy", + appID= "sdkAppID_pp", + transID= "sdkTransactionID_kk", + encData= "deviceData_qq" + ) + + internal fun createAuthenticationResponse(transStatus: String ? = null): AuthenticationResponse { + return createSdkChallengeData().toAuthenticationResponse(transStatus) + } + + internal fun createWalletPaymentRequest(): WalletPaymentRequest { + return WalletPaymentRequest( + cardCode = PaymentMethodCardCode.PAYPAL, + index = 1, + isEmbeddedRedirectionAllowed = true, + merchantReturnUrl = "http://merchant.com/return/url", + securedPaymentParams = createSecuredParams() + ) + } + + internal fun createPaymentRequestCB(): PaymentRequest = PaymentRequest( + cardCode = "CB", + contractNumber = "CB_01", + isEmbeddedRedirectionAllowed = false, + merchantReturnUrl = "http://merchant.dev.com/return/url", + paymentParams = PaymentParams( + network = "2", + expirationDate = "1228", + savePaymentData = false, + holderName = "Jean-Claude" + ) + ) + + internal fun createPaymentRequestGooglePay(): PaymentRequest = PaymentRequest( + cardCode = "GOOGLE_PAY", + contractNumber = "GOOGLE_01", + isEmbeddedRedirectionAllowed = false, + merchantReturnUrl = "http://merchant.dev.com/return/url", + paymentParams = PaymentParams( + googlePayData = "{\"apiVersion\":2,\"apiVersionMinor\":0,\"email\":\"genty.thomas@gmail.com\",\"paymentMethodData\":{\"description\":\"Test Card: Visa •••• 1111\",\"info\":{\"assuranceDetails\":{\"accountVerified\":true,\"cardHolderAuthenticated\":false},\"billingAddress\":{\"countryCode\":\"US\",\"name\":\"Card Holder Name\",\"phoneNumber\":\"6505555555\",\"postalCode\":\"94043\"},\"cardDetails\":\"1111\",\"cardFundingSource\":\"CREDIT\",\"cardNetwork\":\"VISA\"},\"tokenizationData\":{\"token\":\"{\\\"signature\\\":\\\"MEYCIQDehpOq5Ug6urtWzQD76hLa1HF4MIqGQ0ZZDPOEGmasPwIhAKfhJmItFQGJR9EZ8J6RFbANUwvSQIlK1iM38517tCOm\\\",\\\"intermediateSigningKey\\\":{\\\"signedKey\\\":\\\"{\\\\\\\"keyValue\\\\\\\":\\\\\\\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6IMK7zDhF+Ug7X7mipkDnWyghrTVvvZfnjg5XS7G77Ya/4iF3rXJO+BJx4mY8EJmDQrugKy1k/y0Tf29CnQnRw\\\\\\\\u003d\\\\\\\\u003d\\\\\\\",\\\\\\\"keyExpiration\\\\\\\":\\\\\\\"1759620591007\\\\\\\"}\\\",\\\"signatures\\\":[\\\"MEUCIQCn4LpiUh7gTR8o+sAJFs5bGUCWQstlgMiAUKJoONBJnAIgKo3Kn0Qf5HtNza/wBRWaIOYjNWXOIksBbOEd3NkayYU\\\\u003d\\\"]},\\\"protocolVersion\\\":\\\"ECv2\\\",\\\"signedMessage\\\":\\\"{\\\\\\\"encryptedMessage\\\\\\\":\\\\\\\"vkT+3fh76rKRsLJ+w0qczpvaaR1jWnHeoUy4N3SCbGR+wJkJQQ+iZxSEWRi1nhKJfavgaldymKLQvjGxpw45T8Vy3ZVHdaY+12r2IbaOR7xIxVr5gfJCzXM0Rx9viAUGa2ElwF+khiDCF1ef9w8z+bdt+8NJdOwyERHnt6svHSWGytldYvY8NW4hP7WMng0zKbkkFyP5qOcJ2GmQ5TNzOTcaQBh0Jdyhwhxa3Y4CWr9gY7VBhj94xqibtKVVJ7FvWscppuCwNOrF7nTk1oqKnC48WXzb26HByNksSl9PYwaiwurXJEFRJi46f7fscaOWVc98xpRcNzM4hWfMo2kqK9xN0Oz0goDM7h0sSaDMh8w6AmxLY6kS3yJxZNHhK5MZ8kK6dS3190P4G0XNYaoEgYq5KxF+tcTujX+PLL3SSiPQLd+5iq99FAZHsQt22yto4CPYOKxAvo+g+Q+a\\\\\\\",\\\\\\\"ephemeralPublicKey\\\\\\\":\\\\\\\"BARfsLy23mq5xHv7eh6rYpJcHuAyg2vIxbrELvPN0bAFcOJ0hjC/eK0e0QJ5AAhK97j+gojqhDDZRB17xfJ2/0c\\\\\\\\u003d\\\\\\\",\\\\\\\"tag\\\\\\\":\\\\\\\"66dhF0LqeoeX6FTFX2dVFyQGc0TNWiMeTmH94T7YaWo\\\\\\\\u003d\\\\\\\"}\\\"}\",\"type\":\"PAYMENT_GATEWAY\"},\"type\":\"CARD\"},\"shippingAddress\":{\"address1\":\"1600 Amphitheatre Parkway1\",\"address2\":\"\",\"address3\":\"\",\"administrativeArea\":\"CA\",\"countryCode\":\"US\",\"locality\":\"Mountain View\",\"name\":\"US User\",\"phoneNumber\":\"+1 650-555-5555\",\"postalCode\":\"94043\",\"sortingCode\":\"\"}}" + ) + ) + + internal fun createSecuredPaymentRequestCB(): SecuredPaymentRequest = SecuredPaymentRequest( + cardCode = "CB", + contractNumber = "CB_01", + deviceInfo = createDeviceInfo(), + isEmbeddedRedirectionAllowed = false, + merchantReturnUrl = "http://merchant.dev.com/return/url", + paymentParams = PaymentParams( + network = "2", + expirationDate = "1228", + savePaymentData = false, + holderName = "Jean-Claude", + sdkContextData = "{\"deviceRenderingOptionsIF\":\"01\",\"deviceRenderOptionsUI\":\"03\",\"maxTimeout\":60,\"referenceNumber\":\"3DS_LOA_SDK_NEAG_020301_00792\",\"ephemPubKey\":\"P-256;EC;3OXzA9Qt5sV8Ejqd_XXXXXXXXXXZW7Z0AnL4;VC94_YYYYYYYYYYYYYYYYY2r3g\",\"appID\":\"510000-0f48-4d7b-b00a-1b20000001\",\"transID\":\"e450000c0-2300-4000-a46f-3783b5141085\",\"encData\":\"xxxxxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyyyy-oooooooooooooooooooooo-j9314Zwn_9LBTRvdSeI65JwHn_SB-KFTpnbZ8lFJMbfjcTgRTfoDpuU2ALLPIfE81yyUqulfYeUJ0tIVpQk6VMtwL5QfAIU2w4jZ30IlQIChCCW6OXipslYCihAAN-3g9HjY48dBQeNp-IHnMFVnnG-AxI65hgCptmJsoGAR7QrRgQ.zS1yZ6cHMPcdjvu2iw6ayA.nEN6fkOdbnCRZZSZ7UY39Qx829dGegNitt5QqSoYZ6-ZKiCCLHp2b_daHV3waQWZ4FaGMT9QLdQaX-tizhBi6tzb4yFIhWtNUDuz6_dQ-SNl-I4OIzAJURbXCkeY4gkH_rlyZdWCBykKwZ8PLBamgIKkXc9QEyvVhmxUrSdRUJ2DTJjQ2NEo_Xo90uJh62mbdvnYh8sD4-HoHPYDxoH-L-8bVdERM9ppSktuPneOvHwR5GR9Yk7RXv91emLV64QB-uWFJ-Jibg2pWjSZxTS5g-DkEzsjF3EQxIfewxdFmsmjV30G5Kzom0J3-iAfgPaRW8Ir9PCVYUSyn9p2GwN9EeU6W0Rvge4Fnz0-soDQ3DO8KU6ABueouZlE_CPHG7zJTXzOXuPXs5QFWImyXNdB_azgOFEWQLQ1071dWLmKkKCo3kAuzXTzeNqJJgHypprDmOUtpyDIaf-41_r6UVYmRXVIyQfYbW0mABFIzMD6NMLrlu4EB25g913wT_806xZK-q43N8XqBWwaRLvWhFstqEEELKImGzAB0YSP3v3z6lo1qh4q1OY53tcTpynq48MzIhXHRL4DmvxKvNLHOzjU7765GyjFv8Hm2rumoAV1Te50BZB5XKKivSBY52OBuqBWVg1KqLHzUlEx32jGqLZTyxP92AHOGBWHRlWf8EKC121311111111111111EwO5GtaT-34B9tOOHXgVruS9pl0PH8MztIwlfM3llBZo4xTGLPYNycVQ2c0qU1iAGO5YwPnhkABBTornkNQZJQK1M83cQ0HOtL-RRRew00000000000000000000eQO6Wxzkos0PRGOrJ1WYqmTkR4GFyg0g0QT8G94jSXYytPo9mzKfSYYPWPNjbD0Q64MJ8_wi9QzPzCeBR8bPj1724ppaGLz29Bjkcs2mP4w-7ZMT1G6685NTmt6HL176WQUjzlwpBOw03FnUUmG3mDRtzHF2Hccl_YWuBYWExQrUfDL-Ldjzg_D9b8qKeJ2ftVTwjZ9ih9vdYCi7L2cwc5ksJHo03g6Le6egzQD2GqUq4lhIoKfEVHZ4ri8MtDQXYn6XyUG8kw7u-JceGR0AthxUp2lQx6hdNfwNm0FJTqIPsKNTED_6FJ1CiHyaR8ZX-LC\"}" + ), + securedPaymentParams = createSecuredParams() + ) + + internal fun createAvailableCardNetworksRequest(): AvailableCardNetworksRequest = AvailableCardNetworksRequest( + cardNumber = "4970109000000007", + handledContracts = mutableListOf(HandledContract(cardCode = "CB", contractNumber = "CB_01")) + ) + internal fun createAvailableCardNetworksResponse(): AvailableCardNetworksResponse = AvailableCardNetworksResponse( + alternativeNetwork = PaymentMethodCardCode.VISA, + alternativeNetworkCode = "2", + defaultNetwork = PaymentMethodCardCode.CB, + defaultNetworkCode = "1", + selectedContractNumber = "FAKE_CONTRACT" + ) + + internal fun createSecuredParams(): SecuredPaymentParams = SecuredPaymentParams( + pan = "4970109000000007", + cvv = "123" + ) + + internal fun createDeviceInfo(): DeviceInfo = DeviceInfo( + colorDepth = 32, + containerHeight = 498.467, + containerWidth = 750, + javaEnabled = false, + screenHeight = 2424, + screenWidth = 400, + timeZoneOffset = 0 + ) + + internal fun createInternalSDKContext(): InternalSDKContext { + val customLogger = mockk( relaxed = true) + val internalSDKContext = InternalSDKContext( + sdkContext = MnxtSDKContext(environment = MnxtEnvironment.Sandbox) + ) + internalSDKContext.logger = customLogger + + return internalSDKContext; + } + + internal fun createPaymentAttemptCB(): PaymentAttempt { + return PaymentAttempt( + selectedPaymentMethod = createPaymentMethodCB(), + paymentFormData = FormData.Card( + paymentMethod = createPaymentMethodCB(), + cardNum = "4970100000000000", + expDate = "1230", + cvvNum = "123", + holder = "Jean michel", + cardNetwork = CardNetwork(PaymentMethodCardCode.CB, code = "2"), + saveCard = true + + ), + selectedWallet = null, + walletFormData = null + ) + } + + internal fun createPaymentMethodCB(): PaymentMethod.Cards = PaymentMethod.Cards( + paymentMethods = mutableListOf( + PaymentMethod.CB(createPaymentMethodDataCB()) + ), + data = createPaymentMethodDataCB() + ) + + internal fun createPaymentMethodDataCB(): PaymentMethodData = PaymentMethodData( + cardCode = PaymentMethodCardCode.CB, + contractNumber = "CB_01", + disabled = false, + hasForm = false, + hasLogo = false, + isIsolated = false, + options = null, + paymentMethodAction = null, + additionalData = null, + requestContext = null, + shouldBeInTopPosition = false, + state = null, + ) + + internal fun createDirectoryServerSdkKey(): DirectoryServerSdkKey = DirectoryServerSdkKey(scheme = "CB", + rid = "A000000042", + publicKey = "aaaaaa", + rootPublicKey = "bbbbbb") + + internal fun createDirectoryServerSdkKeyResponse(): DirectoryServerSdkKeyResponse = + DirectoryServerSdkKeyResponse(arrayOf(createDirectoryServerSdkKey())) + + } +} \ No newline at end of file diff --git a/monext/src/test/kotlin/com/monext/sdk/internal/api/PaymentAPIImplTest.kt b/monext/src/test/kotlin/com/monext/sdk/internal/api/PaymentAPIImplTest.kt index 1c9bde0..1731095 100644 --- a/monext/src/test/kotlin/com/monext/sdk/internal/api/PaymentAPIImplTest.kt +++ b/monext/src/test/kotlin/com/monext/sdk/internal/api/PaymentAPIImplTest.kt @@ -1,10 +1,7 @@ package com.monext.sdk.internal.api import com.monext.sdk.MnxtEnvironment -import com.monext.sdk.internal.api.model.DeviceInfo -import com.monext.sdk.internal.api.model.request.PaymentParams -import com.monext.sdk.internal.api.model.request.SecuredPaymentParams -import com.monext.sdk.internal.api.model.request.SecuredPaymentRequest +import com.monext.sdk.SdkTestHelper import com.monext.sdk.internal.api.model.response.SessionState import com.monext.sdk.internal.api.model.response.SessionStateType import com.monext.sdk.internal.service.CustomLogger @@ -184,9 +181,9 @@ class PaymentAPIImplTest { @Test fun securedPayment() = runTest(testDispatcher) { // Given - val securedPaymentRequest = createSecuredPaymentRequestCB() + val securedPaymentRequest = SdkTestHelper.createSecuredPaymentRequestCB() val expectedSessionState = SessionStateType.PAYMENT_SUCCESS - val expectedBody: String = "{\"cardCode\":\"CB\",\"contractNumber\":\"CB_01\",\"deviceInfo\":{\"colorDepth\":32,\"containerHeight\":498.467,\"containerWidth\":750,\"javaEnabled\":false,\"screenHeight\":2424,\"screenWidth\":400,\"timeZoneOffset\":0},\"isEmbeddedRedirectionAllowed\":false,\"merchantReturnUrl\":\"http://merchant.dev.com/return/url\",\"paymentParams\":{\"NETWORK\":\"2\",\"EXPI_DATE\":\"1228\",\"SAVE_PAYMENT_DATA\":false,\"HOLDER\":\"Jean-Claude\",\"SDK_CONTEXT_DATA\":\"{\\\"deviceRenderingOptionsIF\\\":\\\"01\\\",\\\"deviceRenderOptionsUI\\\":\\\"03\\\",\\\"maxTimeout\\\":60,\\\"referenceNumber\\\":\\\"3DS_LOA_SDK_NEAG_020301_00792\\\",\\\"ephemPubKey\\\":\\\"P-256;EC;3OXzA9Qt5sV8Ejqd_XXXXXXXXXXZW7Z0AnL4;VC94_YYYYYYYYYYYYYYYYY2r3g\\\",\\\"appID\\\":\\\"510000-0f48-4d7b-b00a-1b20000001\\\",\\\"transID\\\":\\\"e450000c0-2300-4000-a46f-3783b5141085\\\",\\\"encData\\\":\\\"xxxxxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyyyy-oooooooooooooooooooooo-j9314Zwn_9LBTRvdSeI65JwHn_SB-KFTpnbZ8lFJMbfjcTgRTfoDpuU2ALLPIfE81yyUqulfYeUJ0tIVpQk6VMtwL5QfAIU2w4jZ30IlQIChCCW6OXipslYCihAAN-3g9HjY48dBQeNp-IHnMFVnnG-AxI65hgCptmJsoGAR7QrRgQ.zS1yZ6cHMPcdjvu2iw6ayA.nEN6fkOdbnCRZZSZ7UY39Qx829dGegNitt5QqSoYZ6-ZKiCCLHp2b_daHV3waQWZ4FaGMT9QLdQaX-tizhBi6tzb4yFIhWtNUDuz6_dQ-SNl-I4OIzAJURbXCkeY4gkH_rlyZdWCBykKwZ8PLBamgIKkXc9QEyvVhmxUrSdRUJ2DTJjQ2NEo_Xo90uJh62mbdvnYh8sD4-HoHPYDxoH-L-8bVdERM9ppSktuPneOvHwR5GR9Yk7RXv91emLV64QB-uWFJ-Jibg2pWjSZxTS5g-DkEzsjF3EQxIfewxdFmsmjV30G5Kzom0J3-iAfgPaRW8Ir9PCVYUSyn9p2GwN9EeU6W0Rvge4Fnz0-soDQ3DO8KU6ABueouZlE_CPHG7zJTXzOXuPXs5QFWImyXNdB_azgOFEWQLQ1071dWLmKkKCo3kAuzXTzeNqJJgHypprDmOUtpyDIaf-41_r6UVYmRXVIyQfYbW0mABFIzMD6NMLrlu4EB25g913wT_806xZK-q43N8XqBWwaRLvWhFstqEEELKImGzAB0YSP3v3z6lo1qh4q1OY53tcTpynq48MzIhXHRL4DmvxKvNLHOzjU7765GyjFv8Hm2rumoAV1Te50BZB5XKKivSBY52OBuqBWVg1KqLHzUlEx32jGqLZTyxP92AHOGBWHRlWf8EKC121311111111111111EwO5GtaT-34B9tOOHXgVruS9pl0PH8MztIwlfM3llBZo4xTGLPYNycVQ2c0qU1iAGO5YwPnhkABBTornkNQZJQK1M83cQ0HOtL-RRRew00000000000000000000eQO6Wxzkos0PRGOrJ1WYqmTkR4GFyg0g0QT8G94jSXYytPo9mzKfSYYPWPNjbD0Q64MJ8_wi9QzPzCeBR8bPj1724ppaGLz29Bjkcs2mP4w-7ZMT1G6685NTmt6HL176WQUjzlwpBOw03FnUUmG3mDRtzHF2Hccl_YWuBYWExQrUfDL-Ldjzg_D9b8qKeJ2ftVTwjZ9ih9vdYCi7L2cwc5ksJHo03g6Le6egzQD2GqUq4lhIoKfEVHZ4ri8MtDQXYn6XyUG8kw7u-JceGR0AthxUp2lQx6hdNfwNm0FJTqIPsKNTED_6FJ1CiHyaR8ZX-LC\\\"}\"},\"securedPaymentParams\":{\"PAN\":\"4970109000000007\",\"CVV\":\"123\"}}" + val expectedBody = "{\"cardCode\":\"CB\",\"contractNumber\":\"CB_01\",\"deviceInfo\":{\"colorDepth\":32,\"containerHeight\":498.467,\"containerWidth\":750,\"javaEnabled\":false,\"screenHeight\":2424,\"screenWidth\":400,\"timeZoneOffset\":0},\"isEmbeddedRedirectionAllowed\":false,\"merchantReturnUrl\":\"http://merchant.dev.com/return/url\",\"paymentParams\":{\"NETWORK\":\"2\",\"EXPI_DATE\":\"1228\",\"SAVE_PAYMENT_DATA\":false,\"HOLDER\":\"Jean-Claude\",\"SDK_CONTEXT_DATA\":\"{\\\"deviceRenderingOptionsIF\\\":\\\"01\\\",\\\"deviceRenderOptionsUI\\\":\\\"03\\\",\\\"maxTimeout\\\":60,\\\"referenceNumber\\\":\\\"3DS_LOA_SDK_NEAG_020301_00792\\\",\\\"ephemPubKey\\\":\\\"P-256;EC;3OXzA9Qt5sV8Ejqd_XXXXXXXXXXZW7Z0AnL4;VC94_YYYYYYYYYYYYYYYYY2r3g\\\",\\\"appID\\\":\\\"510000-0f48-4d7b-b00a-1b20000001\\\",\\\"transID\\\":\\\"e450000c0-2300-4000-a46f-3783b5141085\\\",\\\"encData\\\":\\\"xxxxxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyyyy-oooooooooooooooooooooo-j9314Zwn_9LBTRvdSeI65JwHn_SB-KFTpnbZ8lFJMbfjcTgRTfoDpuU2ALLPIfE81yyUqulfYeUJ0tIVpQk6VMtwL5QfAIU2w4jZ30IlQIChCCW6OXipslYCihAAN-3g9HjY48dBQeNp-IHnMFVnnG-AxI65hgCptmJsoGAR7QrRgQ.zS1yZ6cHMPcdjvu2iw6ayA.nEN6fkOdbnCRZZSZ7UY39Qx829dGegNitt5QqSoYZ6-ZKiCCLHp2b_daHV3waQWZ4FaGMT9QLdQaX-tizhBi6tzb4yFIhWtNUDuz6_dQ-SNl-I4OIzAJURbXCkeY4gkH_rlyZdWCBykKwZ8PLBamgIKkXc9QEyvVhmxUrSdRUJ2DTJjQ2NEo_Xo90uJh62mbdvnYh8sD4-HoHPYDxoH-L-8bVdERM9ppSktuPneOvHwR5GR9Yk7RXv91emLV64QB-uWFJ-Jibg2pWjSZxTS5g-DkEzsjF3EQxIfewxdFmsmjV30G5Kzom0J3-iAfgPaRW8Ir9PCVYUSyn9p2GwN9EeU6W0Rvge4Fnz0-soDQ3DO8KU6ABueouZlE_CPHG7zJTXzOXuPXs5QFWImyXNdB_azgOFEWQLQ1071dWLmKkKCo3kAuzXTzeNqJJgHypprDmOUtpyDIaf-41_r6UVYmRXVIyQfYbW0mABFIzMD6NMLrlu4EB25g913wT_806xZK-q43N8XqBWwaRLvWhFstqEEELKImGzAB0YSP3v3z6lo1qh4q1OY53tcTpynq48MzIhXHRL4DmvxKvNLHOzjU7765GyjFv8Hm2rumoAV1Te50BZB5XKKivSBY52OBuqBWVg1KqLHzUlEx32jGqLZTyxP92AHOGBWHRlWf8EKC121311111111111111EwO5GtaT-34B9tOOHXgVruS9pl0PH8MztIwlfM3llBZo4xTGLPYNycVQ2c0qU1iAGO5YwPnhkABBTornkNQZJQK1M83cQ0HOtL-RRRew00000000000000000000eQO6Wxzkos0PRGOrJ1WYqmTkR4GFyg0g0QT8G94jSXYytPo9mzKfSYYPWPNjbD0Q64MJ8_wi9QzPzCeBR8bPj1724ppaGLz29Bjkcs2mP4w-7ZMT1G6685NTmt6HL176WQUjzlwpBOw03FnUUmG3mDRtzHF2Hccl_YWuBYWExQrUfDL-Ldjzg_D9b8qKeJ2ftVTwjZ9ih9vdYCi7L2cwc5ksJHo03g6Le6egzQD2GqUq4lhIoKfEVHZ4ri8MtDQXYn6XyUG8kw7u-JceGR0AthxUp2lQx6hdNfwNm0FJTqIPsKNTED_6FJ1CiHyaR8ZX-LC\\\"}\"},\"securedPaymentParams\":{\"PAN\":\"4970109000000007\",\"CVV\":\"123\"}}" mockHttpClientResponse(responseBody = RESPONSE_CONTEXT_SUCCESS) @@ -204,39 +201,50 @@ class PaymentAPIImplTest { ) } - private fun createSecuredPaymentRequestCB(): SecuredPaymentRequest = SecuredPaymentRequest( - cardCode = "CB", - contractNumber = "CB_01", - deviceInfo = createDeviceInfo(), - isEmbeddedRedirectionAllowed = false, - merchantReturnUrl = "http://merchant.dev.com/return/url", - paymentParams = PaymentParams( - network = "2", - expirationDate = "1228", - savePaymentData = false, - holderName = "Jean-Claude", - sdkContextData = "{\"deviceRenderingOptionsIF\":\"01\",\"deviceRenderOptionsUI\":\"03\",\"maxTimeout\":60,\"referenceNumber\":\"3DS_LOA_SDK_NEAG_020301_00792\",\"ephemPubKey\":\"P-256;EC;3OXzA9Qt5sV8Ejqd_XXXXXXXXXXZW7Z0AnL4;VC94_YYYYYYYYYYYYYYYYY2r3g\",\"appID\":\"510000-0f48-4d7b-b00a-1b20000001\",\"transID\":\"e450000c0-2300-4000-a46f-3783b5141085\",\"encData\":\"xxxxxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyyyy-oooooooooooooooooooooo-j9314Zwn_9LBTRvdSeI65JwHn_SB-KFTpnbZ8lFJMbfjcTgRTfoDpuU2ALLPIfE81yyUqulfYeUJ0tIVpQk6VMtwL5QfAIU2w4jZ30IlQIChCCW6OXipslYCihAAN-3g9HjY48dBQeNp-IHnMFVnnG-AxI65hgCptmJsoGAR7QrRgQ.zS1yZ6cHMPcdjvu2iw6ayA.nEN6fkOdbnCRZZSZ7UY39Qx829dGegNitt5QqSoYZ6-ZKiCCLHp2b_daHV3waQWZ4FaGMT9QLdQaX-tizhBi6tzb4yFIhWtNUDuz6_dQ-SNl-I4OIzAJURbXCkeY4gkH_rlyZdWCBykKwZ8PLBamgIKkXc9QEyvVhmxUrSdRUJ2DTJjQ2NEo_Xo90uJh62mbdvnYh8sD4-HoHPYDxoH-L-8bVdERM9ppSktuPneOvHwR5GR9Yk7RXv91emLV64QB-uWFJ-Jibg2pWjSZxTS5g-DkEzsjF3EQxIfewxdFmsmjV30G5Kzom0J3-iAfgPaRW8Ir9PCVYUSyn9p2GwN9EeU6W0Rvge4Fnz0-soDQ3DO8KU6ABueouZlE_CPHG7zJTXzOXuPXs5QFWImyXNdB_azgOFEWQLQ1071dWLmKkKCo3kAuzXTzeNqJJgHypprDmOUtpyDIaf-41_r6UVYmRXVIyQfYbW0mABFIzMD6NMLrlu4EB25g913wT_806xZK-q43N8XqBWwaRLvWhFstqEEELKImGzAB0YSP3v3z6lo1qh4q1OY53tcTpynq48MzIhXHRL4DmvxKvNLHOzjU7765GyjFv8Hm2rumoAV1Te50BZB5XKKivSBY52OBuqBWVg1KqLHzUlEx32jGqLZTyxP92AHOGBWHRlWf8EKC121311111111111111EwO5GtaT-34B9tOOHXgVruS9pl0PH8MztIwlfM3llBZo4xTGLPYNycVQ2c0qU1iAGO5YwPnhkABBTornkNQZJQK1M83cQ0HOtL-RRRew00000000000000000000eQO6Wxzkos0PRGOrJ1WYqmTkR4GFyg0g0QT8G94jSXYytPo9mzKfSYYPWPNjbD0Q64MJ8_wi9QzPzCeBR8bPj1724ppaGLz29Bjkcs2mP4w-7ZMT1G6685NTmt6HL176WQUjzlwpBOw03FnUUmG3mDRtzHF2Hccl_YWuBYWExQrUfDL-Ldjzg_D9b8qKeJ2ftVTwjZ9ih9vdYCi7L2cwc5ksJHo03g6Le6egzQD2GqUq4lhIoKfEVHZ4ri8MtDQXYn6XyUG8kw7u-JceGR0AthxUp2lQx6hdNfwNm0FJTqIPsKNTED_6FJ1CiHyaR8ZX-LC\"}" - ), - securedPaymentParams = SecuredPaymentParams( - pan = "4970109000000007", - cvv = "123" + @Test + fun sdkPayment() = runTest(testDispatcher) { + // Given + val request = SdkTestHelper.createAuthenticationResponse("Y") + val expectedSessionState = SessionStateType.PAYMENT_SUCCESS + val expectedBody = "{\"acsReferenceNumber\":\"acsReferenceNumber\",\"acsTransID\":\"acsTransID\",\"threeDSVersion\":\"threeDSVersion\",\"threeDSServerTransID\":\"threeDSServerTransID\",\"transStatus\":\"Y\"}" + + mockHttpClientResponse(responseBody = RESPONSE_CONTEXT_SUCCESS) + + // When + val result = paymentApi.sdkPaymentRequest(sessionToken = sessionToken, params = request) + + // Then + checkResponseSuccess(expectedSessionState, result) + + // On check aussi la request envoyée + checkHttpRequest( + url = "https://test.example.com/api/v1/services/token/test-session-token-123/SdkPaymentRequest", + method = "POST", + body = expectedBody ) - ) - - private fun createDeviceInfo(): DeviceInfo = DeviceInfo( - colorDepth = 32, - containerHeight = 498.467, - containerWidth = 750, - javaEnabled = false, - screenHeight = 2424, - screenWidth = 400, - timeZoneOffset = 0 - ) + } @Test - @Ignore - fun payment() { - // TODO + fun payment() = runTest(testDispatcher) { + // Given + val request = SdkTestHelper.createPaymentRequestCB() + val expectedSessionState = SessionStateType.PAYMENT_SUCCESS + val expectedBody = "{\"cardCode\":\"CB\",\"merchantReturnUrl\":\"http://merchant.dev.com/return/url\",\"isEmbeddedRedirectionAllowed\":false,\"paymentParams\":{\"NETWORK\":\"2\",\"EXPI_DATE\":\"1228\",\"SAVE_PAYMENT_DATA\":false,\"HOLDER\":\"Jean-Claude\"},\"contractNumber\":\"CB_01\"}" + + mockHttpClientResponse(responseBody = RESPONSE_CONTEXT_SUCCESS) + + // When + val result = paymentApi.payment(sessionToken = sessionToken, params = request) + + // Then + checkResponseSuccess(expectedSessionState, result) + + // On check aussi la request envoyée + checkHttpRequest( + url = "https://test.example.com/api/v1/services/token/test-session-token-123/paymentRequest", + method = "POST", + body = expectedBody + ) } @Test @@ -257,7 +265,6 @@ class PaymentAPIImplTest { // TODO } - /** * Fonction qui permet de vérifier la validité du Mapping des champs pour la réponse SUCCES. Basé sur la variable : RESPONSE_CONTEXT_SUCCESS */ @@ -291,8 +298,6 @@ class PaymentAPIImplTest { assertNotNull(result.paymentSuccess.ticket) } - - private fun checkHttpRequest(url: String, method: String? = "POST", body: String? = null, diff --git a/monext/src/test/kotlin/com/monext/sdk/internal/data/SessionStateRepositoryTest.kt b/monext/src/test/kotlin/com/monext/sdk/internal/data/SessionStateRepositoryTest.kt new file mode 100644 index 0000000..1c234ee --- /dev/null +++ b/monext/src/test/kotlin/com/monext/sdk/internal/data/SessionStateRepositoryTest.kt @@ -0,0 +1,230 @@ +package com.monext.sdk.internal.data + +import android.app.Activity +import com.monext.sdk.Appearance +import com.monext.sdk.MnxtEnvironment +import com.monext.sdk.MnxtSDKContext +import com.monext.sdk.SdkTestHelper +import com.monext.sdk.internal.api.PaymentAPI +import com.monext.sdk.internal.api.configuration.InternalSDKContext +import com.monext.sdk.internal.preview.PreviewSamples +import com.monext.sdk.internal.threeds.ThreeDSManager +import com.monext.sdk.internal.threeds.model.ChallengeUseCaseCallback +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.junit5.MockKExtension +import io.mockk.mockk +import io.mockk.slot +import io.mockk.spyk +import io.mockk.verify +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertNull +import org.junit.jupiter.api.extension.ExtendWith + +@ExtendWith(MockKExtension::class) +class SessionStateRepositoryTest { + + private val testDispatcher = StandardTestDispatcher() + + @RelaxedMockK + private lateinit var threeDSManager: ThreeDSManager + @RelaxedMockK + private lateinit var paymentAPI: PaymentAPI + + private lateinit var underTest: SessionStateRepository + + var internalSDKContext: InternalSDKContext = InternalSDKContext(MnxtSDKContext(environment = MnxtEnvironment.Sandbox)) + internal val sessionStateMethodList = PreviewSamples.sessionStatePaymentMethodsList + + val token: String = "fake_token" + + @BeforeEach + fun setUp() { + underTest = spyk(SessionStateRepository(paymentAPI, internalSDKContext, threeDSManager)) + + // Mock + coEvery { paymentAPI.stateCurrent(any()) } returns sessionStateMethodList + } + + @Test + fun updateSessionState() = runTest(testDispatcher) { + + underTest.updateSessionState(token) + + coVerify(exactly = 1) { paymentAPI.stateCurrent(token) } + assertEquals(sessionStateMethodList, underTest.sessionState.value) + } + + @Test + fun initializeSessionStateWithToken() = runTest(testDispatcher) { + + underTest.initializeSessionState(token) + + coVerify(exactly = 1) { underTest.updateSessionState(token) } + } + + @Test + fun makeSdkPayment() = runTest(testDispatcher) { + val request = SdkTestHelper.createAuthenticationResponse("Y") + + underTest.initializeSessionState(token) + underTest.makeSdkPayment(request) + + coVerify(exactly = 1) { paymentAPI.sdkPaymentRequest(token, request) } + } + + @Test + fun clearSession() = runTest(testDispatcher) { + // Init data + underTest.updateSessionState(token) + coVerify(exactly = 1) { paymentAPI.stateCurrent(token) } + assertEquals(sessionStateMethodList, underTest.sessionState.value) + + // Test + underTest.clearSession() + + assertNull(underTest.sessionState.value) + } + + @Test + fun makeWalletPayment() = runTest(testDispatcher) { + val request = SdkTestHelper.createWalletPaymentRequest() + + underTest.initializeSessionState(token) + underTest.makeWalletPayment(request) + + coVerify(exactly = 1) { paymentAPI.walletPayment(token, request) } + } + + @Test + fun updateContext() { + val internalSDKContextUpdated = + InternalSDKContext(MnxtSDKContext(environment = MnxtEnvironment.Production)) + + underTest.updateContext(internalSDKContextUpdated) + + assertEquals(internalSDKContextUpdated, underTest.internalSDKContext) + verify { paymentAPI.updateContext(internalSDKContextUpdated) } + } + + @Test + fun makeThreeDsChallengeFlow() = runTest { + val sdkChallengeData = SdkTestHelper.createSdkChallengeData() + val authenticationResponse = SdkTestHelper.createAuthenticationResponse("X") + val activity = mockk() + val theme = mockk() + val useCaseCallbackFromParent = mockk(relaxed = true) + // Capturer le callback + val callbackSlot = slot() + + // Mock + coEvery { threeDSManager.doChallengeFlow(activity, sdkChallengeData = sdkChallengeData, theme = theme, useCaseCallback = capture(callbackSlot))} answers { + // Simuler l'appel du callback + callbackSlot.captured.onChallengeCompletion(authenticationResponse) + } + + // Test + underTest.makeThreeDsChallengeFlow(activity, sdkChallengeData, theme, useCaseCallbackFromParent) + + // Verif + coVerify { threeDSManager.doChallengeFlow(activity, sdkChallengeData, theme, any()) } + verify { threeDSManager.closeTransaction() } + verify { useCaseCallbackFromParent.onChallengeCompletion(authenticationResponse) } + } + + + @Test + fun makeSecuredPayment() = runTest(testDispatcher) { + val request = SdkTestHelper.createSecuredPaymentRequestCB() + + underTest.initializeSessionState(token) + underTest.makeSecuredPayment(request) + + coVerify(exactly = 1) { paymentAPI.securedPayment(token, request) } + } + + @Test + fun makePayment() = runTest(testDispatcher) { + val request = SdkTestHelper.createPaymentRequestCB() + + underTest.initializeSessionState(token) + underTest.makePayment(request) + + coVerify(exactly = 1) { paymentAPI.payment(token, request) } + } + + @Test + fun makeGooglePayPayment() = runTest(testDispatcher) { + val request = SdkTestHelper.createPaymentRequestGooglePay() + + underTest.initializeSessionState(token) + underTest.makeGooglePayPayment(request) + + coVerify(exactly = 1) { paymentAPI.payment(token, request) } + } + + @Test + fun getSessionState() = runTest(testDispatcher) { + // Il est null au départ + assertNull(underTest.sessionState.value) + + // On met à jour + underTest.updateSessionState(token) + + coVerify(exactly = 1) { paymentAPI.stateCurrent(token) } + // Il ne doit plus etre null + assertEquals(sessionStateMethodList, underTest.sessionState.value) + } + + @Test + fun availableCardNetworks() = runTest(testDispatcher) { + val request = SdkTestHelper.createAvailableCardNetworksRequest() + + underTest.initializeSessionState(token) + underTest.availableCardNetworks(request) + + coVerify(exactly = 1) { paymentAPI.availableCardNetworks(token, request) } + } + + @Test + fun getReturnURLString() { + assertEquals("https:homologation-payment.payline.com", underTest.returnURLString) + } + + @Test + fun getInternalSDKContext() { + assertEquals(internalSDKContext, underTest.internalSDKContext) + } + + @Test + fun setInternalSDKContext() { + val newContext = mockk() + assertEquals(internalSDKContext, underTest.internalSDKContext) + + // Test + underTest.internalSDKContext = newContext + assertEquals(newContext, underTest.internalSDKContext) + } + + @Test + fun getThreeDSManager() { + val currentThreeDsManager = underTest.threeDSManager + assertEquals(threeDSManager, currentThreeDsManager) + } + + @Test + fun setThreeDSManager() { + val newThreeDSManager = mockk() + assertEquals(threeDSManager, underTest.threeDSManager) + + // Test + underTest.threeDSManager = newThreeDSManager + assertEquals(newThreeDSManager, underTest.threeDSManager) + } + +} \ No newline at end of file diff --git a/monext/src/test/kotlin/com/monext/sdk/internal/presentation/SessionStateViewModelTest.kt b/monext/src/test/kotlin/com/monext/sdk/internal/presentation/SessionStateViewModelTest.kt new file mode 100644 index 0000000..f53a304 --- /dev/null +++ b/monext/src/test/kotlin/com/monext/sdk/internal/presentation/SessionStateViewModelTest.kt @@ -0,0 +1,98 @@ +package com.monext.sdk.internal.presentation + +import android.app.Application +import android.content.Context +import com.monext.sdk.SdkTestHelper +import com.monext.sdk.internal.api.configuration.InternalSDKContext +import com.monext.sdk.internal.api.model.request.SecuredPaymentRequest +import com.monext.sdk.internal.api.model.response.SessionState +import com.monext.sdk.internal.data.SessionStateRepository +import com.monext.sdk.internal.preview.PreviewSamples +import com.monext.sdk.internal.threeds.ThreeDSManager +import io.mockk.coVerify +import io.mockk.every +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.junit5.MockKExtension +import io.mockk.slot +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertNotNull +import org.junit.jupiter.api.extension.ExtendWith +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +@ExtendWith(MockKExtension::class) +class SessionStateViewModelTest { + + private val testDispatcher = StandardTestDispatcher() + + @RelaxedMockK + internal lateinit var sessionStateRepository: SessionStateRepository + @RelaxedMockK + internal lateinit var app: Application + + @RelaxedMockK + private lateinit var context: Context + @RelaxedMockK + internal lateinit var threeDSManager: ThreeDSManager + + internal val captureSecuredPaymentRequest = slot() + + internal var internalSDKContext: InternalSDKContext = SdkTestHelper.createInternalSDKContext() + + internal lateinit var underTest: SessionStateViewModel + + @BeforeEach + fun setUp() { + underTest = SessionStateViewModel(sessionStateRepository, app, dispatcher = testDispatcher) + + every { underTest.sessionStateRepository.threeDSManager } returns threeDSManager + every { underTest.sessionStateRepository.internalSDKContext } returns internalSDKContext + } + + @Test + fun makePaymentShouldMakeCardPayment() = runTest(testDispatcher) { + // Data + val paymentAttemptCB = SdkTestHelper.createPaymentAttemptCB() + var isFinish = false; + val paymentMethodList = PreviewSamples.sessionStatePaymentMethodsList + val cardType = "CB" + val sdkContextData = SdkTestHelper.createSdkContextData() + + // Mock + every { underTest.sessionStateRepository.sessionState } returns MutableStateFlow(paymentMethodList) + every { threeDSManager.isInitialized } returns false + every { threeDSManager.generateSDKContextData(cardType) } returns sdkContextData + + // Test + underTest.makeCardPayment(paymentAttemptCB.paymentFormData, context = context) { + isFinish = true; + } + + // Verif + assertTrue { isFinish } + + coVerify { threeDSManager.startInitialize("fake_token", cardType) } + coVerify { threeDSManager.generateSDKContextData(cardType) } + coVerify { sessionStateRepository.makeSecuredPayment(params = capture(captureSecuredPaymentRequest)) } + + assertEquals("CB", captureSecuredPaymentRequest.captured.cardCode) + assertEquals("CB_01", captureSecuredPaymentRequest.captured.contractNumber) + assertNotNull(captureSecuredPaymentRequest.captured.deviceInfo) + assertTrue(captureSecuredPaymentRequest.captured.isEmbeddedRedirectionAllowed) + // params + assertEquals("2", captureSecuredPaymentRequest.captured.paymentParams.network) + assertEquals("Jean michel", captureSecuredPaymentRequest.captured.paymentParams.holderName) + assertEquals("1230", captureSecuredPaymentRequest.captured.paymentParams.expirationDate) + assertTrue(captureSecuredPaymentRequest.captured.paymentParams.savePaymentData!!) + assertEquals("{\"deviceRenderingOptionsIF\":\"01\",\"deviceRenderOptionsUI\":\"03\",\"maxTimeout\":60,\"referenceNumber\":\"refNumber_xx\",\"ephemPubKey\":\"ephemPubKey_yyy\",\"appID\":\"sdkAppID_pp\",\"transID\":\"sdkTransactionID_kk\",\"encData\":\"deviceData_qq\"}", + captureSecuredPaymentRequest.captured.paymentParams.sdkContextData) + // SecuredParams + assertEquals("4970100000000000", captureSecuredPaymentRequest.captured.securedPaymentParams.pan) + assertEquals("123", captureSecuredPaymentRequest.captured.securedPaymentParams.cvv) + } + +} \ No newline at end of file diff --git a/monext/src/test/kotlin/com/monext/sdk/internal/preview/PaymentAPIPreviewSuccessTest.kt b/monext/src/test/kotlin/com/monext/sdk/internal/preview/PaymentAPIPreviewSuccessTest.kt new file mode 100644 index 0000000..d92e8c3 --- /dev/null +++ b/monext/src/test/kotlin/com/monext/sdk/internal/preview/PaymentAPIPreviewSuccessTest.kt @@ -0,0 +1,59 @@ +package com.monext.sdk.internal.preview + +import com.monext.sdk.MnxtEnvironment +import com.monext.sdk.MnxtSDKContext +import com.monext.sdk.SdkTestHelper +import com.monext.sdk.internal.api.AvailableCardNetworksRequest +import com.monext.sdk.internal.api.configuration.InternalSDKContext +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +/** + * C'est de la preview, on fait des tests not null seulement... + */ +class PaymentAPIPreviewSuccessTest { + + private val underTest : PaymentAPIPreviewSuccess = PaymentAPIPreviewSuccess + + @Test + fun payment() = runBlocking { + assertEquals(PreviewSamples.sessionStateSuccess, underTest.payment("aa", SdkTestHelper.createPaymentRequestCB())) + } + + @Test + fun sdkPaymentRequest() = runBlocking { + assertEquals(PreviewSamples.sessionStateSuccess, underTest.sdkPaymentRequest("aa", SdkTestHelper.createAuthenticationResponse())) + } + + @Test + fun stateCurrent() = runBlocking { + assertEquals(PreviewSamples.sessionStatePaymentMethodsList, underTest.stateCurrent("aa")) + } + + @Test + fun updateContext() = runBlocking { + assertDoesNotThrow { underTest.updateContext(InternalSDKContext(MnxtSDKContext(MnxtEnvironment.Sandbox))) } + } + + @Test + fun walletPayment() = runBlocking { + assertEquals(PreviewSamples.sessionStateSuccess, underTest.walletPayment("aa", SdkTestHelper.createWalletPaymentRequest())) + } + + @Test + fun securedPayment() = runBlocking { + assertEquals(PreviewSamples.sessionStateSuccess, underTest.securedPayment("aa", SdkTestHelper.createSecuredPaymentRequestCB())) + } + + @Test + fun availableCardNetworks() = runBlocking { + assertEquals(SdkTestHelper.createAvailableCardNetworksResponse(), underTest.availableCardNetworks("aa", SdkTestHelper.createAvailableCardNetworksRequest())) + } + + @Test + fun fetchDirectoryServerSdkKeys() = runBlocking { + assertEquals(SdkTestHelper.createDirectoryServerSdkKeyResponse(), underTest.fetchDirectoryServerSdkKeys("aa")) + } + +} \ No newline at end of file diff --git a/monext/src/test/kotlin/com/monext/sdk/internal/threeds/CustomChallengeStatusReceiverTest.kt b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/CustomChallengeStatusReceiverTest.kt new file mode 100644 index 0000000..f9c575d --- /dev/null +++ b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/CustomChallengeStatusReceiverTest.kt @@ -0,0 +1,95 @@ +package com.monext.sdk.internal.threeds + +import com.monext.sdk.SdkTestHelper +import com.monext.sdk.internal.data.SessionStateRepository +import com.monext.sdk.internal.service.CustomLogger +import com.monext.sdk.internal.threeds.model.ChallengeUseCaseCallback +import com.netcetera.threeds.sdk.api.transaction.challenge.ErrorMessage +import com.netcetera.threeds.sdk.api.transaction.challenge.events.CompletionEvent +import com.netcetera.threeds.sdk.api.transaction.challenge.events.ProtocolErrorEvent +import com.netcetera.threeds.sdk.api.transaction.challenge.events.RuntimeErrorEvent +import io.mockk.impl.annotations.InjectMockKs +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.impl.annotations.SpyK +import io.mockk.junit5.MockKExtension +import io.mockk.verify +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith + +@ExtendWith(MockKExtension::class) +class CustomChallengeStatusReceiverTest { + + @RelaxedMockK + private lateinit var customLogger: CustomLogger + @RelaxedMockK + private lateinit var challengeUseCaseCallback: ChallengeUseCaseCallback + + internal val sdkChallengeData = SdkTestHelper.createSdkChallengeData() // Pour le InjectMock + internal val authenticationResponse = SdkTestHelper.createAuthenticationResponse() + + @SpyK + @InjectMockKs + private lateinit var underTest: CustomChallengeStatusReceiver + + @Test + fun cancelled() { + underTest.cancelled() + + // Verif + verify { customLogger.d("CustomChallengeStatusReceiver", "Challenge cancelled !") } + verify { challengeUseCaseCallback.onChallengeCompletion(authenticationResponse) } + } + + @Test + fun protocolError() { + val protocolErrorEvent = ProtocolErrorEvent("111222333", ErrorMessage("111222333", + "errorCodeMsg", "errorDescriptionMsg", "errorDetailMsg", + "errorComponentMsg", "errorMessageTypeMsg", "messageVersionNumberMsg")) + + // Test + underTest.protocolError(protocolErrorEvent) + + // Verif + verify { customLogger.e("CustomChallengeStatusReceiver", "Challenge failed from ProtocolErrorEvent => errorCode: errorCodeMsg - errorDetails: errorDetailMsg - errorDescription: errorDescriptionMsg - errorComponent: errorComponentMsg - errorMessageType:errorMessageTypeMsg - messageVersion: messageVersionNumberMsg", + null) } + verify { challengeUseCaseCallback.onChallengeCompletion(authenticationResponse) } + } + + @Test + fun runtimeError() { + val errorEvent = RuntimeErrorEvent("xxx-yyyy", "errorMessage aaaa") + + // Test + underTest.runtimeError(errorEvent) + + // Verif + verify { customLogger.e("CustomChallengeStatusReceiver", "Challenge failed from RuntimeErrorEvent => errorCode: xxx-yyyy - errorMessage:errorMessage aaaa", + null) } + verify { challengeUseCaseCallback.onChallengeCompletion(authenticationResponse) } + } + + @Test + fun completed() { + val authenticationResponse = SdkTestHelper.createAuthenticationResponse("U") + val completionEvent = CompletionEvent( "111222333", "U") + + // Test + underTest.completed(completionEvent) + + // Verif + verify { customLogger.d("CustomChallengeStatusReceiver", "Challenge completed ! => CompletionEvent{sdkTransactionID='111222333'\n" + + ", transactionStatus='U'}") } + verify { challengeUseCaseCallback.onChallengeCompletion(authenticationResponse) } + } + + @Test + fun timedout() { + underTest.timedout() + + // Verif + verify { customLogger.w("CustomChallengeStatusReceiver", "Challenge timedout !") } + verify { challengeUseCaseCallback.onChallengeCompletion(authenticationResponse) } + } + +} \ No newline at end of file diff --git a/monext/src/test/kotlin/com/monext/sdk/internal/threeds/ThreeDSBusinessTest.kt b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/ThreeDSBusinessTest.kt new file mode 100644 index 0000000..78409df --- /dev/null +++ b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/ThreeDSBusinessTest.kt @@ -0,0 +1,26 @@ +package com.monext.sdk.internal.threeds + +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +class ThreeDSBusinessTest { + + private val underTest: ThreeDSBusiness = ThreeDSBusiness() + + @Test + fun convertValueIfCB_shouldReturnValue() { + assertEquals("visa", underTest.convertValueIfCB("visa")) + } + + @Test + fun convertValueIfCB_shouldConvert() { + assertEquals("cartesBancaires", underTest.convertValueIfCB("CB")) + } + + @Test + fun createConfigParameters() { + val configParameters = underTest.createConfigParameters() + assertNotNull(configParameters) + } + +} \ No newline at end of file diff --git a/monext/src/test/kotlin/com/monext/sdk/internal/threeds/ThreeDSManagerTest.kt b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/ThreeDSManagerTest.kt new file mode 100644 index 0000000..bb29864 --- /dev/null +++ b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/ThreeDSManagerTest.kt @@ -0,0 +1,245 @@ +package com.monext.sdk.internal.threeds + +import ThreeDSConfiguration +import android.app.Activity +import android.content.Context +import com.monext.sdk.Appearance +import com.monext.sdk.SdkTestHelper +import com.monext.sdk.internal.api.PaymentAPI +import com.monext.sdk.internal.api.configuration.InternalSDKContext +import com.monext.sdk.internal.exception.ThreeDsException +import com.monext.sdk.internal.exception.ThreeDsExceptionType +import com.monext.sdk.internal.threeds.model.ChallengeUseCaseCallback +import com.netcetera.threeds.sdk.api.ThreeDS2Service +import com.netcetera.threeds.sdk.api.configparameters.ConfigParameters +import com.netcetera.threeds.sdk.api.configparameters.builder.ConfigurationBuilder +import com.netcetera.threeds.sdk.api.configparameters.builder.SchemeConfiguration +import com.netcetera.threeds.sdk.api.info.SDKInfo +import com.netcetera.threeds.sdk.api.info.SchemeInfo +import com.netcetera.threeds.sdk.api.transaction.AuthenticationRequestParameters +import com.netcetera.threeds.sdk.api.transaction.Transaction +import com.netcetera.threeds.sdk.api.transaction.challenge.ChallengeParameters +import com.netcetera.threeds.sdk.api.ui.ProgressView +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.impl.annotations.SpyK +import io.mockk.junit5.MockKExtension +import io.mockk.mockk +import io.mockk.slot +import io.mockk.verify +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertNull +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertDoesNotThrow +import org.junit.jupiter.api.assertThrows +import org.junit.jupiter.api.extension.ExtendWith +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +@ExtendWith(MockKExtension::class) +class ThreeDSManagerTest { + private val testDispatcher = StandardTestDispatcher() + var internalSDKContext: InternalSDKContext = SdkTestHelper.createInternalSDKContext() + + // allow to capture parameter with non nullable type `Double` + val captureChallengeParameters = slot() + + @RelaxedMockK + private lateinit var paymentApi: PaymentAPI + @RelaxedMockK + private lateinit var context: Context + + @RelaxedMockK + private lateinit var threeDS2ServiceMock: ThreeDS2Service + + @RelaxedMockK + private lateinit var schemeConfigurationMock: SchemeConfiguration + @RelaxedMockK + private lateinit var configurationBuilderMock: ConfigurationBuilder + @RelaxedMockK + private lateinit var configParametersMock: ConfigParameters + + @SpyK + private var threeDSBusiness: ThreeDSBusiness = ThreeDSBusiness() + + private lateinit var underTest: ThreeDSManager + + @BeforeEach + fun setUp() { + underTest = ThreeDSManager(paymentApi, internalSDKContext, context, threeDS2ServiceMock, threeDSBusiness) + } + + + @Test + fun generateSDKContextDataShouldThrowExceptionCauseNotInitialized() { + underTest.isInitialized = false; + + // Test + val exception = assertThrows { underTest.generateSDKContextData(cardType = "CB") } + + // Verif + assertEquals(ThreeDsExceptionType.NOT_INITIALISED, exception.type) + assertEquals("Unable to generate 3DS Context", exception.message) + } + + @Test + fun generateSDKContextData() { + underTest.isInitialized = true; + + val transactionMock = mockk(relaxed = true) + val schemeInfoMock = mockk(relaxed = true) + val sDKInfoMock = mockk(relaxed = true) + val authenticationRequestParametersMock = mockk(relaxed = true) + val expectedSdkReferenceNumber = "sdkReferenceNumber_ooo" + val expectedSdkAppID = "sdkAppID_iii" + val expectedSdkTransactionID = "sdkTransactionID_qqq" + val expectedDeviceData = "deviceData_ppp" + underTest.threeDS2Service = threeDS2ServiceMock + + // Mock + every { threeDS2ServiceMock.createTransaction(any(), any()) } returns transactionMock + every { threeDS2ServiceMock.sdkInfo } returns sDKInfoMock + every { sDKInfoMock.schemeConfigurations } returns mutableListOf(schemeInfoMock) + every { schemeInfoMock.name } returns "CB" + every { schemeInfoMock.ids } returns mutableListOf("000042") + every { threeDSBusiness.convertValueIfCB("CB") } returns "CB" + every { transactionMock.authenticationRequestParameters } returns authenticationRequestParametersMock + // Base64 YWFhYS1iYmJi = aaaa-bbbb + // Base64 eHh4eC15eXl5 = xxxx-yyyy + every { authenticationRequestParametersMock.sdkEphemeralPublicKey } returns "{\"kty\":\"EC\",\"x\":\"YWFhYS1iYmJi\",\"y\":\"eHh4eC15eXl5\",\"crv\":\"P-256\"}" + every { authenticationRequestParametersMock.sdkReferenceNumber } returns expectedSdkReferenceNumber + every { authenticationRequestParametersMock.sdkAppID } returns expectedSdkAppID + every { authenticationRequestParametersMock.sdkTransactionID } returns expectedSdkTransactionID + every { authenticationRequestParametersMock.deviceData } returns expectedDeviceData + + // Test + val sdkContextData = underTest.generateSDKContextData(cardType = "CB") + + // Verif + + verify { threeDS2ServiceMock.createTransaction("000042", ThreeDSConfiguration.MESSAGE_VERSION) } + assertEquals(ThreeDSConfiguration.DEFAULT_DEVICE_RENDERING_OPTIONS_IF, sdkContextData.deviceRenderingOptionsIF) + assertEquals(ThreeDSConfiguration.DEFAULT_DEVICE_RENDER_OPTIONS_UI, sdkContextData.deviceRenderOptionsUI) + assertEquals(ThreeDSConfiguration.MAX_TIMEOUT, sdkContextData.maxTimeout) + assertEquals("P-256;EC;YWFhYS1iYmJi;eHh4eC15eXl5", sdkContextData.ephemPubKey) + assertEquals(expectedSdkReferenceNumber, sdkContextData.referenceNumber) + assertEquals(expectedSdkAppID, sdkContextData.appID) + assertEquals(expectedSdkTransactionID, sdkContextData.transID) + assertEquals(expectedDeviceData, sdkContextData.encData) + } + + @Test + fun initializeInSandboxEnvShouldCallOnCompleted() = runTest(testDispatcher) { + + val sessionToken = "sessionToken_xxx" + val cardCode = "CB" + val serverSdkKeyResponse = SdkTestHelper.createDirectoryServerSdkKeyResponse() + + // Mock + every { threeDSBusiness.createConfigParameters() } returns configurationBuilderMock + every { configurationBuilderMock.build() } returns configParametersMock + coEvery { paymentApi.fetchDirectoryServerSdkKeys(any()) } returns serverSdkKeyResponse + every { threeDSBusiness.createSchemeConfiguration(any(), any()) } returns schemeConfigurationMock + every { schemeConfigurationMock.schemeName } returns "cartesBancaires" + every { threeDS2ServiceMock.initialize(any(), any(),any(),any(),any()) } answers { + // On mock la reponse pour invoquer la callback + val callback = lastArg() + callback.onCompleted() + } + + // Test + underTest.startInitialize(sessionToken, cardCode) + + // Verif + verify { configurationBuilderMock.build() } + verify { configurationBuilderMock.configureScheme(schemeConfigurationMock) } + coVerify { paymentApi.fetchDirectoryServerSdkKeys(sessionToken) } + coVerify { threeDS2ServiceMock.initialize(context, configParametersMock, "EN", any(), any()) } + coVerify { threeDS2ServiceMock.warnings } + assertTrue(underTest.isInitialized) + } + + @Test + fun doChallengeFlowShouldThrowExceptionCauseServiceNotInitialized()= runBlocking { + underTest.isInitialized = false; + + // Mock + val activity = mockk() + val theme = mockk() + val useCaseCallbackFromParent = mockk(relaxed = true) + + // Test + val exception = assertThrows { + underTest.doChallengeFlow( + activity = activity, + sdkChallengeData = SdkTestHelper.createSdkChallengeData(), + theme = theme, + useCaseCallback = useCaseCallbackFromParent + ) + } + + // Verif + assertEquals(ThreeDsExceptionType.NOT_INITIALISED, exception.type) + assertEquals("Unable to start 3DS Challenge Flow", exception.message) + } + + @Test + fun doChallengeFlow() =runBlocking { + underTest.isInitialized = true; + + val activityMock = mockk() + val themeMock = mockk() + val progressViewMocK = mockk(relaxed = true) + val useCaseCallbackFromParent = mockk(relaxed = true) + val transactionMock = mockk(relaxed = true) + underTest.currentOnGoingThreeDsTransaction = transactionMock; + val sdkChallengeData = SdkTestHelper.createSdkChallengeData() + val expectedChallengeParameters : ChallengeParameters = sdkChallengeData.toSdkChallengeParameters() + + // Mock + every { transactionMock.getProgressView(any()) } returns progressViewMocK + + // Test + underTest.doChallengeFlow(activity = activityMock, sdkChallengeData = sdkChallengeData, theme = themeMock, useCaseCallback = useCaseCallbackFromParent) + + // Verif + verify { transactionMock.getProgressView(activityMock) } + verify { progressViewMocK.showProgress() } + verify { transactionMock.doChallenge(activityMock, capture(captureChallengeParameters), any(), 10 ) } + assertTrue(underTest.isInitialized) + + assertEquals(expectedChallengeParameters.acsSignedContent, captureChallengeParameters.captured.acsSignedContent) + assertEquals(expectedChallengeParameters.acsRefNumber, captureChallengeParameters.captured.acsRefNumber) + assertEquals(expectedChallengeParameters.acsTransactionID, captureChallengeParameters.captured.acsTransactionID) + assertEquals(expectedChallengeParameters.get3DSServerTransactionID(), captureChallengeParameters.captured.get3DSServerTransactionID()) + } + + @Test + fun closeTransaction() { + // data + val mockk = mockk(relaxed = true) + val threeDS2Service: ThreeDS2Service = mockk(relaxed = true) + underTest.currentOnGoingThreeDsTransaction = mockk + underTest.threeDS2Service = threeDS2Service + + // Test + underTest.closeTransaction() + + // Verif + verify { mockk.close() } + assertNull(underTest.currentOnGoingThreeDsTransaction) + verify { threeDS2Service.cleanup(context) } + } + + @Test + fun closeTransactionShouldDoNothing() { + assertDoesNotThrow { + underTest.closeTransaction() + } + } +} \ No newline at end of file diff --git a/monext/src/test/kotlin/com/monext/sdk/internal/threeds/model/PaymentSdkChallengeTest.kt b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/model/PaymentSdkChallengeTest.kt new file mode 100644 index 0000000..5708b88 --- /dev/null +++ b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/model/PaymentSdkChallengeTest.kt @@ -0,0 +1,19 @@ +package com.monext.sdk.internal.threeds.model + +import com.monext.sdk.SdkTestHelper +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +class PaymentSdkChallengeTest { + + @Test + fun constructor() { + + val sdkChallengeData = SdkTestHelper.createSdkChallengeData() + + val paymentSdkChallenge = PaymentSdkChallenge(sdkChallengeData) + + assertNotNull(paymentSdkChallenge) + assertEquals(sdkChallengeData, paymentSdkChallenge.sdkChallengeData) + } +} \ No newline at end of file diff --git a/monext/src/test/kotlin/com/monext/sdk/internal/threeds/model/SdkChallengeDataTest.kt b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/model/SdkChallengeDataTest.kt new file mode 100644 index 0000000..362d836 --- /dev/null +++ b/monext/src/test/kotlin/com/monext/sdk/internal/threeds/model/SdkChallengeDataTest.kt @@ -0,0 +1,33 @@ +package com.monext.sdk.internal.threeds.model + +import com.monext.sdk.SdkTestHelper +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class SdkChallengeDataTest { + @Test + fun toSdkChallengeParameters() { + val sdkChallengeData = SdkTestHelper.createSdkChallengeData() + + val response = sdkChallengeData.toSdkChallengeParameters() + + assertEquals("threeDSServerTransID", response.get3DSServerTransactionID()) + assertEquals("acsTransID", response.acsTransactionID) + assertEquals("acsReferenceNumber", response.acsRefNumber) + assertEquals("acsSignedContent", response.acsSignedContent) + } + + @Test + fun toAuthenticationResponse() { + val sdkChallengeData = SdkTestHelper.createSdkChallengeData() + + val response = sdkChallengeData.toAuthenticationResponse("HH") + + assertEquals("acsReferenceNumber", response.acsReferenceNumber) + assertEquals("acsTransID", response.acsTransID) + assertEquals("threeDSVersion", response.threeDSVersion) + assertEquals("threeDSServerTransID", response.threeDSServerTransID) + assertEquals("HH", response.transStatus) + } + +} diff --git a/settings.gradle.kts b/settings.gradle.kts index c37030f..76c58ff 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,6 +14,7 @@ pluginManagement { dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { + mavenLocal() google() mavenCentral() }