{"id":29003898,"url":"https://github.com/braintree/braintree_android","last_synced_at":"2026-04-02T20:27:22.145Z","repository":{"id":18441787,"uuid":"21631528","full_name":"braintree/braintree_android","owner":"braintree","description":"Braintree SDK for Android","archived":false,"fork":false,"pushed_at":"2026-04-01T23:44:07.000Z","size":158831,"stargazers_count":423,"open_issues_count":21,"forks_count":257,"subscribers_count":108,"default_branch":"main","last_synced_at":"2026-04-02T06:45:45.159Z","etag":null,"topics":["android","braintree","credit-card","payments","sdk"],"latest_commit_sha":null,"homepage":"https://developer.paypal.com/braintree/docs/start/hello-client/android/v4","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"udacity/ud859","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/braintree.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2014-07-08T22:33:02.000Z","updated_at":"2026-04-01T23:43:23.000Z","dependencies_parsed_at":"2023-10-13T03:14:36.092Z","dependency_job_id":"7f0a7c24-3828-4c73-aaee-7409961eb1fd","html_url":"https://github.com/braintree/braintree_android","commit_stats":null,"previous_names":[],"tags_count":242,"template":false,"template_full_name":null,"purl":"pkg:github/braintree/braintree_android","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/braintree%2Fbraintree_android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/braintree%2Fbraintree_android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/braintree%2Fbraintree_android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/braintree%2Fbraintree_android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/braintree","download_url":"https://codeload.github.com/braintree/braintree_android/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/braintree%2Fbraintree_android/sbom","scorecard":{"id":250800,"data":{"date":"2025-08-11","repo":{"name":"github.com/braintree/braintree_android","commit":"2505cf706df0940718a036d4cfb23893e25943f0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":6,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":9,"reason":"Found 28/30 approved changesets -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/firebase_deploy_demo.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/release_snapshot.yml:1","Warn: topLevel 'security-events' permission set to 'write': .github/workflows/security.yml:8","Info: topLevel 'packages' permission set to 'read': .github/workflows/security.yml:9","Info: topLevel 'actions' permission set to 'read': .github/workflows/security.yml:10","Warn: topLevel 'contents' permission set to 'write': .github/workflows/security.yml:5","Warn: topLevel 'statuses' permission set to 'write': .github/workflows/security.yml:7","Warn: no topLevel permission defined: .github/workflows/static_analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Binary-Artifacts","score":8,"reason":"binaries present in source code","details":["Warn: binary detected: DataCollector/libs/android-magnessdk-5.5.1.jar:1","Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/firebase_deploy_demo.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/firebase_deploy_demo.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/firebase_deploy_demo.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/firebase_deploy_demo.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:254: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:86: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:122: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:146: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:170: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:182: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:220: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:134: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:158: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:281: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:289: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:170: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:86: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:158: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:182: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:220: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:122: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:134: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:146: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_snapshot.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/release_snapshot.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/security.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/security.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/security.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/security.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/static_analysis.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/static_analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/static_analysis.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/static_analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/braintree/braintree_android/tests.yml/main?enable=pin","Info:   0 out of  38 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":7,"reason":"SAST tool is not run on all commits -- score normalized to 7","details":["Warn: 20 commits out of 28 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T08:25:34.422Z","repository_id":18441787,"created_at":"2025-08-17T08:25:34.422Z","updated_at":"2025-08-17T08:25:34.422Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31315950,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","braintree","credit-card","payments","sdk"],"created_at":"2025-06-25T10:39:58.866Z","updated_at":"2026-04-02T20:27:22.140Z","avatar_url":"https://github.com/braintree.png","language":"Kotlin","funding_links":["https://developer.paypal.com/braintree/docs/start/hello-client/android/v4","https://developer.paypal.com/braintree/docs/guides/overview","https://developer.paypal.com/braintree/docs/guides/client-sdk/deprecation-policy","https://developer.paypal.com/braintree/articles"],"categories":[],"sub_categories":[],"readme":"# Braintree Android SDK\n\n![GitHub Actions Tests](https://github.com/braintree/braintree_android/workflows/Tests/badge.svg)\n[![Instrumentation tests](https://github.com/braintree/braintree_android/actions/workflows/instrumentation_tests.yml/badge.svg)](https://github.com/braintree/braintree_android/actions/workflows/instrumentation_tests.yml)\n\nWelcome to Braintree's Android SDK. This library will help you accept card and alternative payments in your Android app.\n\n:mega:\u0026nbsp;\u0026nbsp;A new major version of the SDK is now available. See the [v5 migration guide](v5_MIGRATION_GUIDE.md) for details.\n\n**The Braintree SDK supports Android API 23 and above.**\n\nThe Braintree SDK requires Java 11 and uses Kotlin 1.9.10.\n\n## 📣 Announcements\n\n**Upgrade your integration to continue accepting Braintree payments** The SSL certificates for the Android SDK are set to expire by March 30, 2026. Upgrade to v4.45.0+ or v5.0.0+ to continue processing payments using the Braintree SDK. ![Click here for more details](https://github.com/braintree/braintree_android/issues/993)\n\n## Adding It To Your Project\n\nThe features of the Braintree SDK are organized into modules that can be imported as dependencies in your `build.gradle` file.\nSee the [Migration Guide](v5_MIGRATION_GUIDE.md) for specific dependencies required for each module.\n\nFor an integration offering card payments, add the following dependency in your `build.gradle`:\n\n```groovy\ndependencies {\n    implementation 'com.braintreepayments.api:card:5.25.0'\n}\n```\n\nTo preview the latest work in progress builds, add the following SNAPSHOT dependency in your `build.gradle`:\n\n```groovy\ndependencies {\n    implementation 'com.braintreepayments.api:card:5.0.0-beta2-SNAPSHOT'\n}\n```\n\nYou will also need to add the Sonatype snapshots repo to your top-level `build.gradle` to import SNAPSHOT builds:\n\n```groovy\nallprojects {\n    repositories {\n        maven {\n            url 'https://oss.sonatype.org/content/repositories/snapshots/'\n        }\n    }\n}\n```\n\n## Documentation\n\nStart with [**'Hello, Client!'**](https://developer.paypal.com/braintree/docs/start/hello-client/android/v4) for instructions on basic setup and usage.\n\nNext, read the [**full documentation**](https://developer.paypal.com/braintree/docs/guides/overview) for information about integration options, such as Drop-In UI, PayPal and credit card tokenization.\n\n## Upgrade Your SDK Version\n\nWe always recommend updating to the latest version of the SDK which can be found in our [CHANGELOG](https://github.com/braintree/braintree_android/blob/main/CHANGELOG.md). \n\nFor major version upgrades, feel free to check out the [MIGRATION GUIDE](https://github.com/braintree/braintree_android/blob/main/v5_MIGRATION_GUIDE.md).\n\nFor more details on how to add and managed build dependencies, see the [**Android Developer Guidelines**](https://developer.android.com/build/dependencies).\n\n## Versions\n\nThis SDK abides by our Client SDK Deprecation Policy. For more information on the potential statuses of an SDK check our [developer docs](https://developer.paypal.com/braintree/docs/guides/client-sdk/deprecation-policy).\n\n| Major version number | Status      | Released      | Deprecated   | Unsupported  |\n|----------------------|-------------|---------------|--------------|--------------|\n| 5.x.x                | Active      | October 2024  | TBA          | TBA          |\n| 4.x.x                | Deprecated  | June 2021     | October 2025 | October 2026 |\n| 3.x.x                | Unsupported | February 2019 | June 2022    | June 2023    |\n| 2.x.x                | Unsupported | November 2015 | March 2020   | March 2021   |\n\nVersions 3.x.x and below are unsupported.\n\n## Payment Buttons\n\nThe Braintree Android SDK now allows merchants to draw and render both PayPal and Venmo payment buttons using a discrete set of parameters. The SDK will handle the loading and disable state of the button and allow you to display and offer buttons meeting the current brand guidelines versus maintaining responsibility on your own. We will call the `tokenize` methods with your request and allow you a seamless branded experience in your mobile apps.\n\n*Note:* Ensure you include the `UIComponents` module in your project to use this feature.\n\nIf you would like to draw a PayPal branded button in your mobile app, you can do so like this:\n\n```xml\n\u003ccom.braintreepayments.api.uicomponents.PayPalButton\n    android:id=\"@+id/payPalButton\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    custom:buttonColor=\"blue\" /\u003e\n```\n\n```kotlin\nclass ExampleFragment : Fragment() {\n    private lateinit var payPalButton: PayPalButton\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        payPalButton = view.findViewById\u003cPayPalButton\u003e(R.id.payPalButton)\n        payPalButton.initialize(\n            activityResultCaller = this,\n            authorization = \"[TOKENIZATION_KEY or CLIENT_TOKEN]\",\n            appLinkReturnUrl = Uri.parse(\"https://merchant-app.com\"),\n            deepLinkFallbackUrlScheme = \"com.merchant.app.payments\"\n        )\n        payPalButton.updatePayPalRequest(PayPalRequest(...))\n        paypalButton.setLaunchCallback = { launchResult -\u003e\n            when (launchResult) {\n                is PayPalPendingRequest.Started-\u003e {\n                    // store pending request to disk\n                }\n                is PayPalPendingRequest.Failure -\u003e {\n                    // handle error\n                }\n            }\n        }\n    }\n    \n    override fun onResume() {\n        super.onResume()\n        val pendingRequest = fetchPendingRequest()\n        if (pendingRequest != null) {\n            payPalButton.handleReturnToApp(pendingRequest, intent) { payPalResult -\u003e\n                when (payPalResult) {\n                    is PayPalResult.Success -\u003e {\n                        // handle success\n                    }\n                    is PayPalResult.Failure -\u003e {\n                        // handle failure\n                    }\n                    is PayPalResult.Cancel -\u003e {\n                        // handle canceled\n                    }\n                }\n            }\n        }\n        // clear pending request\n    }\n}\n```\n\nSimilarly, if you would like to draw a Venmo branded button in your mobile app, you can do so like this:\n\n```xml\n\u003ccom.braintreepayments.api.uicomponents.VenmoButton\n    android:id=\"@+id/venmoButton\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    custom:buttonColor=\"blue\" /\u003e\n```\n\n```kotlin\nclass ExampleFragment : Fragment() {\n    private lateinit var venmoButton: VenmoButton\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        venmoButton = view.findViewById\u003cVenmoButton\u003e(R.id.venmoButton)\n        venmoButton.initialize(\n            activityResultCaller = this,\n            authorization = \"[TOKENIZATION_KEY or CLIENT_TOKEN]\",\n            appLinkReturnUrl = Uri.parse(\"https://merchant-app.com\"),\n            deepLinkFallbackUrlScheme = \"com.merchant.app.payments\"\n        )\n        venmoButton.setVenmoRequest(VenmoRequest(...))\n        venmoButton.setLaunchCallback = { launchResult -\u003e\n            when (launchResult) {\n                is  VenmoPendingRequest.Started-\u003e {\n                    // store pending request to disk\n                }\n                is VenmoPendingRequest.Failure -\u003e {\n                    // handle error\n                }\n            }\n        }\n    }\n    \n    override fun onResume() {\n        super.onResume()\n        val pendingRequest = fetchPendingRequest()\n        if (pendingRequest != null) {\n            venmoButton.handleReturnToApp(pendingRequest, intent) { payPalResult -\u003e\n                when (payPalResult) {\n                    is VenmoResult.Success -\u003e {\n                        // handle success\n                    }\n                    is VenmoResult.Failure -\u003e {\n                        // handle failure\n                    }\n                    is VenmoResult.Cancel -\u003e {\n                        // handle canceled\n                    }\n                }\n            }\n        }\n        // clear pending request\n    }\n}\n```\n\n### Compose support for Buttons\nWe now offer support for Jetpack Compose composable buttons.\nSimilar to the XML buttons, the Braintree Android SDK now allows merchants to draw and render both PayPal and Venmo \npayment buttons using a discrete set of parameters. The SDK will handle the loading and disable state of the button \nand allow you to display and offer buttons meeting the current brand guidelines versus maintaining responsibility on \nyour own. We will call the `tokenize` methods with your request and allow you a seamless branded experience in your \nmobile apps. The call to `handleReturnToApp` when the control is returned to the merchant app is handled within the \nSDK. You are no longer required to add this logic to your code.\n\nFor PayPal button, you should invoke the PayPalButton composable like this:\n```kotlin\n\nprivate val paypalTokenizeCallback = PayPalTokenizeCallback { payPalResult -\u003e\n    when (payPalResult) {\n        is PayPalResult.Success -\u003e {\n            handlePayPalResult(payPalResult.nonce)\n        }\n\n        is PayPalResult.Cancel -\u003e {\n            handleError(Exception(\"User did not complete PayPal payment flow\"))\n        }\n\n        is PayPalResult.Failure -\u003e {\n            handleError(payPalResult.error)\n        }\n    }\n    // clear intent data\n    // requireActivity().intent.data = null\n}\n\nPayPalButton(\n    style = paypalStyle,\n    payPalRequest = paypalRequest,\n    authorization = authStringArg,\n    appLinkReturnUrl = \"https://merchant-app.com\".toUri(),\n    deepLinkFallbackUrlScheme = \"com.merchant.app.payments\",\n    paypalTokenizeCallback = paypalTokenizeCallback\n)\n```\n\nFor Venmo button, you should invoke the PayPalButton composable like this:\n```kotlin\nprivate val venmoTokenizeCallback = VenmoTokenizeCallback { venmoResult -\u003e\n    when (venmoResult) {\n        is VenmoResult.Success -\u003e {\n            handleVenmoResult(venmoResult.nonce)\n        }\n\n        is VenmoResult.Cancel -\u003e {\n            handleError(Exception(\"User did not complete Venmo payment flow\"))\n        }\n\n        is VenmoResult.Failure -\u003e {\n            handleError(venmoResult.error)\n        }\n    }\n    // clear intent data\n    // requireActivity().intent.data = null\n}\n\nVenmoButton(\n    style = venmoStyle,\n    venmoRequest = venmoRequest,\n    authorization = authStringArg,\n    appLinkReturnUrl = \"https://merchant-app.com\".toUri(),\n    deepLinkFallbackUrlScheme = \"com.merchant.app.payments\",\n    venmoTokenizeCallback = venmoTokenizeCallback\n)\n```\n\nAfter you've received a result, clear out the `intent.data` by setting it to null.\n\n```kotlin\nintent.data = null\n```\n\n## Help\n\n* [Read the docs](https://developer.paypal.com/braintree/docs/guides/overview)\n* [Check out the reference docs](https://braintree.github.io/braintree_android/index.html)\n* Find a bug? [Open an issue](https://github.com/braintree/braintree_android/issues)\n* Want to contribute? [Check out contributing guidelines](CONTRIBUTING.md) and [submit a pull request](https://help.github.com/articles/creating-a-pull-request).\n\n## Feedback\n\nThe Braintree Android SDK is in active development. We welcome your feedback!\n\nHere are a few ways to get in touch:\n\n* [GitHub Issues](https://github.com/braintree/braintree_android/issues/new/choose) - For generally applicable issues and feedback\n* [Braintree Support](https://developer.paypal.com/braintree/articles) / [support@braintreepayments.com](mailto:support@braintreepayments.com) -\nfor personal support at any phase of integration\n\n## License\n\nThe Braintree Android SDK is open source and available under the MIT license. See the [LICENSE](LICENSE) file for more info.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbraintree%2Fbraintree_android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbraintree%2Fbraintree_android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbraintree%2Fbraintree_android/lists"}