Braintree Drop-In SDK for Android

Overview

Braintree Android Drop-In

Tests

Braintree Android Drop-In is a readymade UI that allows you to accept card and alternative payments in your Android app.

📣   A new major version of the SDK is now available. See the v6 migration guide for details.

Screenshot of Drop-In

Adding it to your project

Add the dependency in your build.gradle:

dependencies {
  implementation 'com.braintreepayments.api:drop-in:6.0.1'
}

Additionally, add the following Maven repository and (non-sensitive) credentials to your app-level gradle:

repositories {
    maven {
        url "https://cardinalcommerceprod.jfrog.io/artifactory/android"
        credentials {
            username 'braintree_team_sdk'
            password 'AKCp8jQcoDy2hxSWhDAUQKXLDPDx6NYRkqrgFLRc3qDrayg6rrCbJpsKKyMwaykVL8FWusJpp'
        }
    }
}

Versions

This SDK abides by our Client SDK Deprecation Policy. For more information on the potential statuses of an SDK, check our developer docs.

Major version number Status Released Deprecated Unsupported
6.x.x Active November 2021 TBA TBA
5.x.x Inactive September 2020 November 2022 November 2023
4.x.x Deprecated February 2019 September 2021 September 2022

Versions 3 and below are unsupported.

Usage

Create a DropInRequest to start the Drop-in UI with specified options:

val dropInRequest = DropInRequest()

DropInClient is responsible for launching the Drop-in UI. To launch Drop-in, instantiate a DropInClient with client authorization and call DropInClient#launchDropInForResult with the DropInRequest you configured above and a request code that you have defined for Drop-in:

val dropInClient = DropInClient(this, "<#CLIENT_AUTHORIZATION#>", dropInRequest)
dropInClient.launchDropInForResult(this, DROP_IN_REQUEST_CODE)

To handle the result of the Drop-in flow, override onActivityResult:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == DROP_IN_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            val result: DropInResult? = data?.getParcelableExtra(DropInResult.EXTRA_DROP_IN_RESULT)
            val paymentMethodNonce = result?.paymentMethodNonce?.string
            // use the result to update your UI and send the payment method nonce to your server
        } else if (resultCode == RESULT_CANCELED) {
            // the user canceled
        } else {
            // an error occurred, checked the returned exception
            val error: Exception? = data?.getSerializableExtra(DropInResult.EXTRA_ERROR) as? Exception
        }
    }
}

Localization

Drop-In is currently localized for 25 languages. To view localized text for a specific locale, open its corresponding values-<LOCALE_NAME>/strings.xml resource file.

3D Secure + Drop-in

Drop-In supports 3D-Secure verification. Assuming you have 3D-Secure configured for your account, create a ThreeDSecureRequest() object, setting ThreeDSecurePostalAddress and ThreeDSecureAdditionalInformation fields where possible; the more fields that are set, the less likely a user will be presented with a challenge. For more information, check our 3D Secure Migration Guide. Make sure to attach this object to the BTDropInRequest before use.

val address = ThreeDSecurePostalAddress()
address.givenName = "Jill" // ASCII-printable characters required, else will throw a validation error
address.surname = "Doe" // ASCII-printable characters required, else will throw a validation error
address.phoneNumber = "5551234567"
address.streetAddress = "555 Smith St"
address.extendedAddress = "#2"
address.locality = "Chicago"
address.region = "IL"
address.postalCode = "12345"
address.countryCodeAlpha2 = "US"

// Optional additional information.
// For best results, provide as many additional elements as possible.
val additionalInformation = ThreeDSecureAdditionalInformation()
additionalInformation.shippingAddress = address

val threeDSecureRequest = ThreeDSecureRequest()
threeDSecureRequest.amount = "1.00"
threeDSecureRequest.email = "[email protected]"
threeDSecureRequest.billingAddress = address
threeDSecureRequest.versionRequested = VERSION_2
threeDSecureRequest.additionalInformation = additionalInformation

val dropInRequest = DropInRequest()
dropInRequest.threeDSecureRequest = threeDSecureRequest

Fetch last used payment method

If your user already has an existing payment method, you may not need to show Drop-in. You can check if they have an existing payment method using DropInClient#fetchMostRecentPaymentMethod. A payment method will only be returned when using a client token created with a customer_id.

val dropInClient = DropInClient(this, "<#CLIENT_TOKEN_WITH_CUSTOMER_ID>", dropInRequest)
dropInClient.fetchMostRecentPaymentMethod(this) { dropInResult, error ->
    error?.let {
        // an error occurred
    }
    dropInResult?.let { result ->
        result.paymentMethodType?.let { paymentMethodType ->
            // use the icon and name to show in your UI
            val icon = paymentMethodType.drawable
            val name = paymentMethodType.localizedName

            if (paymentMethodType == DropInPaymentMethod.GOOGLE_PAY) {
                // The last payment method the user used was Google Pay.
                // The Google Pay flow will need to be performed by the
                // user again at the time of checkout.
            } else {
                // Show the payment method in your UI and charge the user
                // at the time of checkout.
                val paymentMethod = result.paymentMethodNonce
            }
        }
    } ?: run {
        // there was no existing payment method
    }
}

Help

Feedback

Here are a few ways to get in touch:

License

Braintree Android Drop-In is open source and available under the MIT license. See the LICENSE file for more info.

Comments
  • Credit Card that should fail is not failling

    Credit Card that should fail is not failling

    General information

    SDK/Library version: :3.3.0 Environment: SandBox Android 8

    Issue description

    As a developer I can test with a declined credit card, so that I should be notified my payment was not successful

    opened by r9software 32
  • Unsafe implementation of the HostnameVerifier interface - vulnerability

    Unsafe implementation of the HostnameVerifier interface - vulnerability

    General information

    • SDK/Library version: 5.0.1
    • Environment:Production
    • Android Version and Device: Any device

    Issue description

    I tried to publish app in Google Play, but my app has been rejected due to unsafe implementation of the HostnameVerifier interface. I believe this is because Google Play changed policy and are not allowing anymore such a vulnerability.

    I ran scanner to find potential sources in our app and report clearly say that Braintree SDK ( its dependencies) ignore SSL errors:

    WebHybridClient.java in PayPal 5.3 and earlier for Android ignores SSL errors, which allows man-in-the-middle attackers to spoof servers and obtain sensitive information.

    Please fix your issue asap, since is blocking Google Play publishes.

    opened by marcin-owoc 30
  • Sensitive data in memory

    Sensitive data in memory

    General information

    • SDK/Library version: 5.x version, 6.0.1
    • Environment: both
    • Android Version and Device: all devices

    Issue description

    Our application was found to store the credit or debit card number, expiry date and CVV in memory after the initial card registration for the entire period that the application was running thereafter. After exiting and re-starting the application, the data was no longer found in memory. I downloaded the demo project with the latest library (6.0.1), made a memory dump after registering the card and returning back to the main screen in the demo project, and the dump has all the data - the card number, cvv code, expiration date, and so on. The same situation with previous version too - with the latest 5.x version. In the memory dump, you can see that the credit card number is stored in several memory areas This still could present a risk where this was running on a rooted device, and a malicious application was monitoring memory for stored card data. Please see an example in the memory dump (test card): "operationName":"TokenizeCreditCard","variables":{"input":{"options":{"validate":true},"creditCard":{"number":"5105105105105100","expirationMonth":"08","expirationYear":"24","cvv":"200","billingAddress":{"postalCode":"347900"}}}}}

    opened by Pirokar 18
  • ClassNotFoundException: com.braintreepayments.api.dropin.DropInRequest

    ClassNotFoundException: com.braintreepayments.api.dropin.DropInRequest

    General information

    • SDK/Library version: API 27 | Braintree Android 2.6.2/Drop-in 3.1/Card 5.1.1
    • Gradle version: 4.4.1
    • Environment: Sandbox
    • Android Version and Device: Galaxy S7/7.0

    Issue description

    I'm working with this library in relation to the cordova-plugin-braintree library. Building the app works great, but when I tap on the drop-in UI, the app crashes and I see the following in the logs:

    Class not found when unmarshalling: com.braintreepayments.api.dropin.DropInRequest
    ClassNotFoundException: com.braintreepayments.api.dropin.DropInRequest
    

    Here's the gradle file for the plugin:

    def packageName = getPackageName()
    
    android {
        defaultConfig {
            applicationId packageName
        }
    }
    
    dependencies {
        compile 'com.braintreepayments.api:braintree:2.3.12'
        compile 'com.braintreepayments.api:drop-in:3.0.1'
        compile 'io.card:android-sdk:5.4.1'
    }
    
    def getPackageName() {
        def config = file("res/xml/config.xml").getText()
        def xml = new XmlParser(false, false).parseText(config)
        return xml.attribute("id")
    }
    

    I realize that this may not be directly related to the SDK, so just hoping for some pointers on what I might look for. Appreciated!

    opened by jamesdixon 18
  • Crash in 'BrowserSwitchClient' in version 3.14.0

    Crash in 'BrowserSwitchClient' in version 3.14.0

    From: @TatyanaRTB

    General information

    • SDK/Library version: Android SDK 4.0.1
    • Environment: Development
    • Android Version and Device: All Android versions with various devices
    • Braintree dependencies:
    • com.braintreepayments.api:braintree:3.14.0
    • com.braintreepayments.api:drop-in:4.6.0
    • com.braintreepayments.api:google-payment:3.3.1

    Issue description

    The issue is related to https://github.com/braintree/braintree_android/issues/308. Firstly we observed crash from the #308 and now after fixes crash happens in next step by code, when BrowserSwitchOptions.start is called:

    ThreeDSecure:

    public static void continuePerformVerification(BraintreeFragment fragment, ThreeDSecureRequest request, ThreeDSecureLookup threeDSecureLookup) {
        boolean showChallenge = threeDSecureLookup.getAcsUrl() != null;
        String threeDSecureVersion = threeDSecureLookup.getThreeDSecureVersion();
        fragment.sendAnalyticsEvent(String.format("three-d-secure.verification-flow.challenge-presented.%b", showChallenge));
        fragment.sendAnalyticsEvent(String.format("three-d-secure.verification-flow.3ds-version.%s", threeDSecureVersion));
        if (!showChallenge) {
            completeVerificationFlowWithNoncePayload(fragment, threeDSecureLookup.getCardNonce());
        } else if (!threeDSecureVersion.startsWith("2.")) {
            fragment.browserSwitch(13487, ThreeDSecureV1BrowserSwitchHelper.getUrl(fragment.getReturnUrlScheme(), fragment.getConfiguration().getAssetsUrl(), request, threeDSecureLookup));
        } else {
            performCardinalAuthentication(fragment, threeDSecureLookup);
        }
    }
    

    BrowserSwitchFragment:

    public void browserSwitch(int requestCode, String url) {
        BrowserSwitchOptions browserSwitchOptions = (new BrowserSwitchOptions()).requestCode(requestCode).url(Uri.parse(url));
        this.browserSwitchClient.start(browserSwitchOptions, this);
    }
    

    BrowserSwitchClient:

    public void start(BrowserSwitchOptions browserSwitchOptions, Fragment fragment) {
        if (fragment instanceof BrowserSwitchListener) {
            this.start(browserSwitchOptions, fragment, (BrowserSwitchListener)fragment);
        } else {
            throw new IllegalArgumentException("Fragment must implement BrowserSwitchListener.");
        }
    }
    

    The issue can be reproduced by the following steps:

    1. Select credit card option in DropIn dialog
    2. Enter card parameters
    3. Press Go/Next button on the keyboard two-three times: https://monosnap.com/file/kcCFXR7wLZkKU7MtGu1bgvD6dHJaqF

    Please block the button from several payment attempts if request to Braintree API is already in progress. Several payment flows are started in parallel and BraintreeFragment is detached from Activity when receive first successful payment result. Other payment results cause this crash.

    java.lang.IllegalStateException: Fragment must be attached to an activity.
    	at com.braintreepayments.browserswitch.BrowserSwitchClient.start(BrowserSwitchClient.java:206) ~[na:0.0]
    	at com.braintreepayments.browserswitch.BrowserSwitchClient.start(BrowserSwitchClient.java:186) ~[na:0.0]
    	at com.braintreepayments.browserswitch.BrowserSwitchFragment.browserSwitch(BrowserSwitchFragment.java:59) ~[na:0.0]
    	at com.braintreepayments.api.ThreeDSecure.continuePerformVerification(ThreeDSecure.java:266) ~[na:0.0]
    	at com.braintreepayments.api.ThreeDSecure$3.onLookupComplete(ThreeDSecure.java:155) ~[na:0.0]
    	at com.braintreepayments.api.ThreeDSecure$7.success(ThreeDSecure.java:503) ~[na:0.0]
    	at com.braintreepayments.api.internal.HttpClient$3.run(HttpClient.java:288) ~[na:0.0]
    	at android.os.Handler.handleCallback(Handler.java:739) ~[na:0.0]
    	at android.os.Handler.dispatchMessage(Handler.java:95) ~[na:0.0]
    	at android.os.Looper.loop(Looper.java:157) ~[na:0.0]
    	at android.app.ActivityThread.main(ActivityThread.java:5429) ~[na:0.0]
    	at java.lang.reflect.Method.invoke(Native Method) ~[na:0.0]
    	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) ~[na:0.0]
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) ~[na:0.0]
    
    fixed in beta 
    opened by sshropshire 17
  • **Action Required** Bintray Sunset - Cardinal Commerce Credentials Update

    **Action Required** Bintray Sunset - Cardinal Commerce Credentials Update

    The credentials for accessing the Cardinal Mobile SDK have changed, due to the sunset of Bintray.

    Please update the credentials in your app-level build.gradle to the following:

    repositories {
        maven {
            url "https://cardinalcommerceprod.jfrog.io/artifactory/android"
            credentials {
                username 'braintree_team_sdk'
                password 'AKCp8jQcoDy2hxSWhDAUQKXLDPDx6NYRkqrgFLRc3qDrayg6rrCbJpsKKyMwaykVL8FWusJpp'
            }
        }
    }
    

    If you continue to have problems accessing the Cardinal Mobile SDK, we recommend upgrading to Drop-in version 5.2.2 or later.

    opened by sarahkoop 16
  • Venmo : 400 Bad request

    Venmo : 400 Bad request

    Hey,

    I am using venmo payment in my android app. i got the HTTP 400 Bad Request when try to payment. can anyone tell me why i get this error.

    screenshot_2017-04-16-11-47-19

    Thanks,

    opened by nilsorathiya 15
  • Android: Manifest merger failed with multiple errors, see logs with Braintree

    Android: Manifest merger failed with multiple errors, see logs with Braintree

    I am getting this error when I add Braintree depedency.

    Execution failed for task ':vtg:processDevDebugManifest'. Manifest merger failed with multiple errors, see logs

    Braintree version:

    // app gradle implementation 'com.braintreepayments.api:drop-in:5.3.0'

    // project gradle

    maven {
        url "https://cardinalcommerceprod.jfrog.io/artifactory/android"
        credentials {
            username 'braintree_team_sdk'
            password 'AKCp8jQcoDy2hxSWhDAUQKXLDPDx6NYRkqrgFLRc3qDrayg6rrCbJpsKKyMwaykVL8FWusJpp'
        }
    }
    

    I checked the Merged Manifest tab but I cannot see any error over there.

    What could be the cause?

    opened by aanalmehta 14
  • ERROR: Failed to resolve: org.jfrog.cardinalcommerce.gradle:cardinalmobilesdk:2.1.4-1

    ERROR: Failed to resolve: org.jfrog.cardinalcommerce.gradle:cardinalmobilesdk:2.1.4-1

    General information

    • SDK/Library version: 4.3.0
    • Environment: Sandbox
    • Android Version and Device: API 23+

    ERROR: Failed to resolve: org.jfrog.cardinalcommerce.gradle:cardinalmobilesdk:2.1.4-1

    I am getting mentioned error for; implementation "com.braintreepayments.api:drop-in:4.3.0"

    opened by GeeksEmpireOfficial 14
  • dropInClient.launchDropInForResult allow Fragments or better registerForActivityResult

    dropInClient.launchDropInForResult allow Fragments or better registerForActivityResult

    General information

    • SDK/Library version: 6.0.0.
    • Environment: sandbox
    • Android Version and Device: any

    Issue description

    dropInClient.launchDropInForResult() requires Activity. But in this case startActivityForResult is called on activity, not in attached fragment. So result is returned to activity and not into active fragment.

    Expected behavior

    launchDropInForResult accept Fragments, so we can expect result in Fragment and not only in activity.

    Or even better accept Activity Result APIs lambda function to handle result in callback through registerForActivityResult. More info about Activity Result APIs: https://developer.android.com/training/basics/intents/result https://medium.com/e-legion/the-right-way-to-get-a-result-part-i-activity-result-api-6efbcaa5600d

    opened by mtrakal 13
  • Could not resolve cardinalmobilesdk Required by: braintreepayments:5.2.1( In provided Demo Project as well)

    Could not resolve cardinalmobilesdk Required by: braintreepayments:5.2.1( In provided Demo Project as well)

    https://github.com/braintree/braintree-android-drop-in

    I just download the project and run on my android setup same issue in the demo project too

    Could not GET 'https://cardinalcommerce.bintray.com/android/org/jfrog/cardinalcommerce/gradle/cardinalmobilesdk/2.2.4-1/cardinalmobilesdk-2.2.4-1.pom'. Received status code 403 from server

    opened by khalil05400 12
  • Add Client Metadata Id Accessor to DropInClient

    Add Client Metadata Id Accessor to DropInClient

    Summary of changes

    • Add DropInClient#getClientMetadataId() method

    Checklist

    • [x] Added a changelog entry

    Authors

    List GitHub usernames for everyone who contributed to this pull request.

    • @sshropshire
    opened by sshropshire 0
  • DropIn PayPal process payment issue

    DropIn PayPal process payment issue

    General information

    • SDK/Library version: 6.5.0, 6.5.1
    • Environment: PayPal SandBox
    • Android Version and Device: Samsung Galaxy Tab S6 with Android 12

    Issue description

    I'm using DropIn on Android platform to perform Payment by PayPal. Please find below the steps:

    1. Start activity that shows DropIn
    2. Select PayPal as Payment process from DropIn UI
    3. as soon as the PayPal payment process is complete the PayPal screen is closed and my activity receives: User canceled DropIn (event is received as error: UserCanceledException)
    4. Using standard Credit Card payment flow works fine

    Thanks and regards.

    opened by lcervelli 8
  • Bump `braintree_android` Dependency Versions

    Bump `braintree_android` Dependency Versions

    Summary of changes

    • Bump braintree_android module dependency versions to 4.21.1

    Checklist

    • [x] Added a changelog entry

    Authors

    List GitHub usernames for everyone who contributed to this pull request.

    • @sshropshire
    opened by sshropshire 0
  • DropIn UI 3D Secure while add card to vault

    DropIn UI 3D Secure while add card to vault

    General information

    • SDK/Library version: com.braintreepayments.api:drop-in:6.5.0, braintree: 4.20.0
    • Environment: Production
    • Android Version and Device: Not relevant, all

    Response from your Support team:

    Non-recurring merchant initiated transactions will be processed much the same way that recurring transactions would be. You should request a cardholder challenge to establish SCA when the card is first authorized, establishing a mandate between you and your customer. This can be with a verification, or the first transaction of a recurring billing event. By applying 3D Secure to the first transaction or verification, you signal to the card issuer that you have established a mandate between you and your customer to charge their payment method for subsequent recurring payments as detailed in your terms and conditions. Establishing SCA on verifications will be useful for scenarios where the cardholder will not be present when the charge is issued, and the amount isn’t known when the payment method is stored. For subsequent transactions from that payment method, which would be outside of the scope of PSD2 SCA, use the unscheduled value in the TransactionSource parameter of the Transaction.Sale() API call. Lastly, please note that gateway rejections are not the same as declines. Gateway rejections are blocked by your gateway settings, while declines are blocked by the customer's bank. I hope this helps answer your questions. If you have any additional questions, please let me know.

    Issue description

    Try to create a payment using a Credit card. We need to store card to Vault manager with 3D Secure validation due to Eurepean regulation and PSD2.

    Create a request with 3D Secure for request a cardholder challenge using: isChallengeRequested / isCardAddChallengeRequested is not possible, we try it with:

    val threeD = ThreeDSecureRequest().apply {
            paymentAmount.let { amount = String.format(Locale.ENGLISH, "%.2f", it) }      
            email = userInfo.email
            billingAddress = userInfo.toThreeDSecurePostalAddress()
            mobilePhoneNumber = userPhone
            versionRequested = ThreeDSecureRequest.VERSION_2
            /**
             * Request full 3DS flow to verify card.
             * Should be used for avoid [2099 errors](https://developer.paypal.com/braintree/docs/reference/general/processor-responses/authorization-responses#code-2099)
             */
            if (isOnlyCardAdd) {
                isCardAddChallengeRequested = true
            } else {
                isChallengeRequested = true
            }
            additionalInformation = userInfo.additionalInformation.toThreeDSecureAdditionalInfo()
    }
    
    val dropInRequest = DropInRequest().apply {
            isPayPalDisabled = true
            isVaultManagerEnabled = false
            isGooglePayDisabled = true
            threeDSecureRequest = threeD
            isVenmoDisabled = true
    }
    
        private fun initDropInClient() {
            dropInClient = DropInClient(this) { clientToken ->
                viewState.braintreeToken.value?.token?.let { clientToken.onSuccess(it) }.ifNullThen {
                    clientToken.onFailure(Exception("Braintree token is null"))
                }
            }
        }
        
        private fun startDropIn() {
            dropInClient
                .apply { setListener(dropInListener) }
                .run { launchDropIn(dropInRequest) }
        }
    

    The issue is, that while adding card in DropIn UI threeDSecureRequest from dropInRequest is ignored and user address/additional info are not sent with card to card issuer / bank. So the card is not possible to verify in that case.

    Request which is send from DropIn UI SDK to Braintree API:

    {
      "clientSdkMetadata": {
        "platform": "android",
        "sessionId": "****",
        "source": "form",
        "integration": "custom"
      },
      "query": "mutation TokenizeCreditCard($input: TokenizeCreditCardInput!) {  tokenizeCreditCard(input: $input) {    token    creditCard {      bin      brand      expirationMonth      expirationYear      cardholderName      last4      binData {        prepaid        healthcare        debit        durbinRegulated        commercial        payroll        issuingBank        countryOfIssuance        productId      }    }  }}",
      "operationName": "TokenizeCreditCard",
      "variables": {
        "input": {
          "options": {
            "validate": true
          },
          "creditCard": {
            "number": "*****",
            "expirationMonth": "**",
            "expirationYear": "**",
            "cvv": "***"
          }
        }
      }
    }
    

    Missing validation info from threeDSecureRequest, in that case is not applied isChallengeRequested / isCardAddChallengeRequested to request as you can see from request, only card info is sent.

    Response to this request is:

    {
      "errors": [
        {
          "message": "CVV verification failed",
          "locations": [
            {
              "line": 1,
              "column": 66
            }
          ],
          "path": [
            "tokenizeCreditCard"
          ],
          "extensions": {
            "errorClass": "VALIDATION",
            "errorType": "user_error",
            "inputPath": [
              "input",
              "creditCard",
              "cvv"
            ],
            "legacyCode": "81736"
          }
        }
      ],
      "data": {
        "tokenizeCreditCard": null
      },
      "extensions": {
        "requestId": "***"
      }
    }
    

    Because Bank Issuer can't validate Credit card without address, etc it return 2099 error. Your API return misunderstood error about wrong CVC. But CVC is correct, same as card number and expiration date.

    Current state:

    • user click on Pay (or Add card, depends on screen)
    • app open DropIn UI with selection of payment method (only Credit or Debit Card is available, that's ok)
    • user click on Credit or Debit Card
    • DropIn UI client open screen with Card details
    • user fill Card Number and click on Next button
    • user fill Expiration date and CVC/CVV and click on ADD CARD button
    • DropIn UI show error: CVC is invalid.That's not correct, because card info is ok, but error 2099

    Expected state

    • user click on Pay (od Add card, depends on screen)
    • app open DropIn UI with selection of payment method (only Credit or Debit Card is available, that's ok)
    • user click on Credit or Debit Card
    • DropIn UI client open screen with Card details
    • user fill Card Number and click on Next button
    • user fill Expiration date and CVC/CVV and click on ADD CARD button
    • DropIn Client send all info (addtition, address, phone, etc) with card number
    • DropIn UI client show 3D Secure screen for add card to Vault manager
    opened by mtrakal 4
  • 6.5.0 DropInClient - Method addObserver must be called on the main thread

    6.5.0 DropInClient - Method addObserver must be called on the main thread

    I am working on react native module for DropIn and getting this error on initialization of DropInClient

    implementation "com.braintreepayments.api:drop-in:6.5.0

             val dropInClient = DropInClient(currentActivity as AppCompatActivity?,clientToken)
             
    

    Method addObserver must be called on the main thread

    Why this error can appear?

    opened by molchanovskiy 11
  • CardinalComm SDK 60 Warning Template - Id Bridging

    CardinalComm SDK 60 Warning Template - Id Bridging

    General information

    • SDK/Library version: 5.+
    • Environment: Production
    • Android Version and Device: -

    Issue description

    We received email from Google Play Store title: CardinalComm SDK 60 Warning Template - Id Bridging Screenshot 2022-12-01 at 12 30 18 PM

    Please help to assist

    triaged 
    opened by faezmurshidi 19
Releases(6.6.0)
  • 6.6.0(Dec 22, 2022)

  • 6.5.1(Dec 8, 2022)

  • 6.5.0(Dec 5, 2022)

  • 6.4.0(Oct 26, 2022)

    • Bump braintree_android module dependency versions to 4.19.0
    • Notify merchant via error message the payment method is duplicated (fixes #357)
    • Android 13 Support
    • Upgrade targetSdkVersion and compileSdkVersion to API 33
    • Collect device data for Card payments that aren't using 3D Secure (fixes #364)
    Source code(tar.gz)
    Source code(zip)
  • 6.3.0(Sep 1, 2022)

  • 6.2.0(Jul 27, 2022)

    • Check if BottomSheetFragment is visible using Android Fragment API (fixes #348)
    • Fix issue where UserCanceledException was not being sent on bottom sheet dismissal (fixes #346)
    • Bump braintree_android module dependency versions to 4.12.0
    • Add launchDropIn() method
    • Deprecate launchDropInForResult(Activity, Int) in favor of launchDropIn() method
    Source code(tar.gz)
    Source code(zip)
  • 6.1.0(May 25, 2022)

    • Update Vault Manager inline documentation
    • Add ClientTokenProvider interface for asynchronously fetching client token authorization
    • Add new DropInClient constructors that accept ClientTokenProvider or tokenization key string
    • Deprecate DropInClient constructor that accepts Context in favor of new constructors
    • Bump braintree_android module dependency versions to 4.10.1
    • Bump card-form to 5.4.0
    Source code(tar.gz)
    Source code(zip)
  • 6.0.2(Jan 25, 2022)

  • 6.0.1(Dec 13, 2021)

  • 6.0.0(Nov 19, 2021)

    • Bump braintree_android module dependency versions to 4.7.0
    • Bump card-form to 5.3.0
    • Localization
      • Add support for Czech, Greek, Finnish, Hebrew, Hungrian, and Slovak localization
    • Venmo
      • Add VenmoRequest setter to DropInRequest
      • Don't show Venmo payment method option when Venmo not installed on device
    • CardForm
      • Focus Cardholder Name field when adding card details if field not disabled (fixes #180)
    • DropInRequest
      • Set explicit class loader for DropInRequest (fixes #191)
      • Wrap DropInRequest in Parcelable bundle (fixes #228)
    • Accessibility
      • Increase color contrast and add content descriptions for screen readers
    • Breaking Changes
      • Language Support
        • Require Java 8 or higher
      • Localization
        • Remove support for Turkish localization
      • Visibility
        • Make BottomSheetState package-private
        • Make DropInEventType package-private
        • Make DropInActivity#onError package-private
        • Make AnimatedButtonView package-private
        • Make PaymentMethodItemView package-private
        • Make SupportedPaymentMethodsViewHolder package-private
        • Make VaultedPaymentMethodSelectedListener package-private
        • Make static strings in DropInClient package-private
        • Make DropInClient#deliverBrowserSwitchResult package-private
        • Make DropInResultCallback package-private
        • Make PaymentMethodDeleteException package-private
      • Venmo
        • Remove vaultVenmo on DropInRequest in favor of setting shouldVault on VenmoRequest
      • DropInPaymentMethod
        • Rename DropInPaymentMethodType to DropInPaymentMethod
      • DropInRequest
        • Remove requestThreeDSecureVerification from DropInRequest
    Source code(tar.gz)
    Source code(zip)
  • 6.0.0-beta2(Sep 17, 2021)

    • Android 12 Support
      • Bump braintree_android module dependency versions to 4.6.0
      • Upgrade targetSdkVersion and compileSdkVersion to API 31
      • Fix issue where Venmo app is not detected on Android 12 devices
    • Breaking Changes
      • DropInRequest
        • Remove collectDeviceData from DropInRequest in favor of always returning device data on DropInResult
    Source code(tar.gz)
    Source code(zip)
  • 5.3.0(Sep 16, 2021)

  • 6.0.0-beta1(Sep 7, 2021)

    • Dependencies
      • Include braintree-core, three-d-secure, paypal, venmo, google-pay, card, data-collector, and union-pay as api
      • Bump card-form to 5.2.0
    • DropInClient
      • Add DropInClient
      • Add DropInResultCallback
      • Add FetchMostRecentPaymentMethodCallback
      • Add GetSupportedCardTypesCallback
    • Fragment Architecture
      • Add SupportedPaymentMethodsFragment
      • Add BottomSheetFragment
      • Add VaultedPaymentMethodSelectedListener
      • Add BottomSheetState
      • Add DropInEventType
      • Add DropInViewModel
      • Add SupportedPaymentMethodsViewHolder
    • Exceptions
      • Add PaymentMethodDeleteException
    • Breaking Changes
      • Dependencies
        • Bump braintree_android module dependency versions to 4.4.1
      • Package Structure
        • Flatten package structure and move all classes to com.braintreepayments.api package
      • DropInRequest
        • Remove clientToken, tokenizationKey, and authorization from DropInRequest in favor of instantiating DropInClient with authorization
        • Remove deprecated amount parameter from DropInRequest
        • Remove intent from DropInRequest
        • Remove builder pattern from DropInRequest
        • Update DropInRequest getter and setter methods to follow consistent naming for Kotlin synthesized properties
      • DropInResult
        • Remove DropInResultListener
        • Remove DropInResult#fetchDropInResult()
        • Make DropInResult constructor package-private
      • PaymentMethodType
        • Rename PaymentMethodType to DropInPaymentMethodType
        • Change DropInPaymentMethodType#getCardTypes() parameter from Set to List
      • DropInActivity
        • Remove ConfigurationListener, PaymentMethodNonceCreatedListener, PaymentMethodNonceUpdatedListener, PaymentMethodSelectedListener, BraintreeErrorListener, BraintreeCancelListener from DropInActivity
        • Replace DropInActivity.EXTRA_ERROR with DropInResult.EXTRA_ERROR
        • Remove BaseActivity
        • Remove onBackPressed, onBackgroundClicked and onVaultEditButtonClicked methods
      • Fragment Architecture
        • Replace VaultManagerActivity with VaultManagerFragment
        • Replace AddCardActivity with AddCardFragment and CardDetailsFragment
      • Adapters
        • Make SupportedPaymentMethodsAdapter package-private
        • Make VaultedPaymentMethodsAdapter package-private
        • Make VaultManagerPaymentMethodsAdapter package-private
      • Listeners
        • Remove AddPaymentUpdateListener
        • Remove AnimationFinishedListener
      • CardViews
        • Remove AddCardView
        • Remove EditCardView
        • Remove EnrollmentCardView

    Note: The credentials for integrating with 3DS have changed. If you are using 3DS please update the credentials in your app-level build.gradle

    Source code(tar.gz)
    Source code(zip)
  • 5.2.2(Jul 8, 2021)

  • 5.2.1(Apr 14, 2021)

  • 5.2.0(Mar 9, 2021)

    • Update android-card-form version to 5.1.0 (fixes #212)
    • Fix null pointer crash in BaseActivity#shouldRequestThreeDSecureVerification (fixes #207)
    • Update Visa card icons
    Source code(tar.gz)
    Source code(zip)
  • 5.1.0(Jan 25, 2021)

  • 5.0.2(Jan 8, 2021)

    • Fix issue where payment methods disabled on DropInRequest were displayed if previously vaulted (fixes #205)
    • Bump braintree_android version to 3.15.0 (fixes #208)
    Source code(tar.gz)
    Source code(zip)
  • 5.0.1(Oct 27, 2020)

  • 5.0.0(Sep 29, 2020)

    • Add vaultVenmo option to DropInRequest
    • Bump braintree_android version to 3.14.1
    • Bump compileSdkVersion and targetSdkVersion to API level 30
    • Breaking Changes
      • Bump card-form version to 5.0.0 (removes support for CardIO, a no longer maintained framework)
    Source code(tar.gz)
    Source code(zip)
  • 4.6.0(Jun 17, 2020)

    • Bump braintree_android version to 3.11.1
    • Bump card-form version to 4.3.0 (Updates Card icons)
    • Update payment method icons (fixes issue where Google Pay icon did not meet new brand guidelines)
    • Update bt_add_card string resource for french locales.
    • Add 3DS support for non-network tokenized Google Pay cards
    Source code(tar.gz)
    Source code(zip)
  • 4.5.0(Dec 12, 2019)

  • 4.4.1(Sep 23, 2019)

  • 4.4.0(Sep 11, 2019)

  • 4.3.1(Aug 30, 2019)

  • 4.3.0(Aug 10, 2019)

  • 4.2.0(Jun 18, 2019)

  • 4.1.1(Apr 30, 2019)

    • Add DropInRequest#disableCard to disable Card payment method
    • Fix Google Payment issue where Google Pay does not communicate back to BraintreeFragment
    Source code(tar.gz)
    Source code(zip)
  • 4.1.0(Mar 6, 2019)

  • 4.0.0(Feb 2, 2019)

Segmenkt - The SegmenKT Kotlin SDK is a Kotlin-first SDK for Segment

SegmenKT Kotlin SDK The SegmenKT Kotlin SDK is a Kotlin-first SDK for Segment. I

UNiDAYS 0 Nov 25, 2022
Frogo SDK - SDK Core for Easy Development

SDK for anything your problem to make easier developing android apps

Frogobox 10 Dec 15, 2022
HubSpot Kotlin SDK 🧺 Implementation of HubSpot API for Java/Kotlin in tiny SDK

HubSpot Kotlin SDK ?? Implementation of HubSpot API for Java/Kotlin in tiny SDK

BOOM 3 Oct 27, 2022
AWS SDK for Android. For more information, see our web site:

AWS SDK for Android For new projects, we recommend interacting with AWS using the Amplify Framework. The AWS SDK for Android is a collection of low-le

AWS Amplify 976 Dec 29, 2022
Countly Product Analytics Android SDK

Countly Android SDK We're hiring: Countly is looking for Android SDK developers, full stack devs, devops and growth hackers (remote work). Click this

Countly Team 648 Dec 23, 2022
Android Real Time Chat & Messaging SDK

Android Chat SDK Overview Applozic brings real-time engagement with chat, video, and voice to your web, mobile, and conversational apps. We power emer

Applozic 659 May 14, 2022
Evernote SDK for Android

Evernote SDK for Android version 2.0.0-RC4 Evernote API version 1.25 Overview This SDK wraps the Evernote Cloud API and provides OAuth authentication

Evernote 424 Dec 9, 2022
Air Native Extension (iOS and Android) for the Facebook mobile SDK

Air Native Extension for Facebook (iOS + Android) This is an AIR Native Extension for the Facebook SDK on iOS and Android. It has been developed by Fr

Freshplanet 219 Nov 25, 2022
Android Chat SDK built on Firebase

Chat21 is the core of the open source live chat platform Tiledesk.com. Chat21 SDK Documentation Features With Chat21 Android SDK you can: Send a direc

Chat21 235 Dec 2, 2022
Liquid SDK (Android)

Liquid Android SDK Quick Start to Liquid SDK for Android This document is just a quick start introduction to Liquid SDK for Android. We recommend you

Liquid 17 Nov 12, 2021
AWS SDK for Android. For more information, see our web site:

AWS SDK for Android For new projects, we recommend interacting with AWS using the Amplify Framework. The AWS SDK for Android is a collection of low-le

AWS Amplify 975 Dec 24, 2022
新浪微博 Android SDK

ReadMe 公告: 鉴于线上服务器出现问题,推荐下载本地aar后上传到自己公司的服务器,保证后续服务稳定, 我们也将尽快重新提供一个稳定的地址供大家使用。 新包地址:https://github.com/sinaweibosdk/weibo_android_sdk/tree/master/2019

SinaWeiboSDK 1.8k Dec 30, 2022
Official Appwrite Android SDK 💚 🤖

Appwrite Android SDK This SDK is compatible with Appwrite server version 0.8.x. For older versions, please check previous releases. Appwrite is an ope

Appwrite 62 Dec 18, 2022
This App is sending Face capture data over network, built around the latest Android Arcore SDK.

AndroidArcoreFacesStreaming From any Android phone ArCore compatible, using this app will send over TCP 5680 bytes messages: The first 5616 bytes is a

Maxime Dupart 30 Nov 16, 2022
Trackingplan for Android SDK

With Trackingplan for Android you can make sure that your tracking is going as you planned without changing your current analytics stack or code.

Trackingplan 3 Oct 26, 2021
Desk360 Mobile Chat SDK for Android

Desk360 Chat Android SDK Introduction Desk360 Live Chat SDK is an open source Android library that provides live support to your customers directly fr

null 31 Dec 13, 2022
Storyblok Kotlin Multiplatform SDK sample (Android, JVM, JS)

storyblok-mp-SDK-sample *WIP* ... a showcase of the Storyblok Kotlin Multiplatform Client SDK. (Android, JVM, JS, iOS, ...) What's included ?? • About

Mike Penz 6 Jan 8, 2022
A demo of Rongcloud uniapp sdk integration for compiling debug-apk in Android Studio

Rongcloud-uniapp-sdk-demo A demo of Rongcloud uniapp sdk integration for compiling debug-apk in Android Studio 这是一个为了给uniapp在Android平台打出debug-apk的demo

Zongkui Guo 1 Oct 13, 2021
StreamPack: live streaming SDK for Android based on Secure Reliable Transport

StreamPack: live streaming SDK for Android based on Secure Reliable Transport (SRT) StreamPack brings the best audio/video live technologies together

guo shao hong 2 Aug 10, 2022