From eaeecd2f7fb07d90185283c4636dfc710dcc8cf7 Mon Sep 17 00:00:00 2001 From: agedd <105314544+agedd@users.noreply.github.com> Date: Tue, 12 Dec 2023 09:37:04 -0600 Subject: [PATCH 01/21] Create PayPalMessaging Module (#847) * added new module for paypal-messaging * Created empty PayPalMessagingClient.kt and PayPalMessagingClientUnitTest.ktclass files * Added AndroidManifest.xml to this module * Created build.gradle to include necessary dependencies and settings Co-authored-by: Jax DesMarais-Leder --- PayPalMessaging/build.gradle | 57 +++++++++++++++++++ PayPalMessaging/src/main/AndroidManifest.xml | 4 ++ .../paypalmessaging/PayPalMessagingClient.kt | 4 ++ .../PayPalMessagingClientUnitTest.kt | 4 ++ settings.gradle | 1 + 5 files changed, 70 insertions(+) create mode 100644 PayPalMessaging/build.gradle create mode 100644 PayPalMessaging/src/main/AndroidManifest.xml create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt create mode 100644 PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt diff --git a/PayPalMessaging/build.gradle b/PayPalMessaging/build.gradle new file mode 100644 index 0000000000..e48dad4031 --- /dev/null +++ b/PayPalMessaging/build.gradle @@ -0,0 +1,57 @@ +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' +} + +android { + compileSdkVersion rootProject.compileSdkVersion + + defaultConfig { + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + testOptions { + unitTests { + includeAndroidResources = true + all { + jvmArgs '-noverify' + } + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility versions.javaSourceCompatibility + targetCompatibility versions.javaTargetCompatibility + } +} + +dependencies { + api project(':BraintreeCore') + + implementation deps.coreKtx + implementation deps.kotlinStdLib + implementation deps.appCompat + + testImplementation deps.junitTest +} + +// region signing and publishing + +project.ext.name = "paypal-messaging" +project.ext.pom_name = "paypal-messaging" +project.ext.group_id = "com.braintreepayments.api" +project.ext.version = rootProject.version +project.ext.pom_desc = "PayPal Messaging dependencies for Braintree Android." + +apply from: rootProject.file("gradle/gradle-publish.gradle") + +// endregion \ No newline at end of file diff --git a/PayPalMessaging/src/main/AndroidManifest.xml b/PayPalMessaging/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..3b3f6da835 --- /dev/null +++ b/PayPalMessaging/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt new file mode 100644 index 0000000000..efc9c4568e --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt @@ -0,0 +1,4 @@ +package com.braintreepayments.api.paypalmessaging +class PayPalMessagingClient { + // TODO: Add functionality in a future PR +} \ No newline at end of file diff --git a/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt b/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt new file mode 100644 index 0000000000..bc3a8ee401 --- /dev/null +++ b/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt @@ -0,0 +1,4 @@ +package com.braintreepayments.api.paypalmessaging +class PayPalMessagingClientUnitTest { + // TODO: Add unit tests in a future PR +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 69ddff8106..48f93a810d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,3 +16,4 @@ include ':TestUtils' include ':Demo' include ':SEPADirectDebit' include ':PayPalDataCollector' +include ':PayPalMessaging' From be8351532a8fede913651ca960a05af7ba391464 Mon Sep 17 00:00:00 2001 From: Jax DesMarais-Leder Date: Mon, 18 Dec 2023 09:34:40 -0600 Subject: [PATCH 02/21] Add PayPal Messaging Release Steps (#863) * Add testing PayPalMessaging to GitHub workflows * Add PayPalMessaging to build.gradle --- .github/workflows/release.yml | 13 +++++++++++++ .github/workflows/release_snapshot.yml | 13 +++++++++++++ .../api/paypalmessaging/PayPalMessagingClient.kt | 2 +- .../PayPalMessagingClientUnitTest.kt | 2 +- build.gradle | 1 + 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 156ecc768e..c010e20442 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -126,6 +126,18 @@ jobs: uses: ./.github/actions/unit_test_module with: module: PayPal + unit_test_paypal_messaging: + name: PayPal Messaging Unit Tests + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + - name: Setup Java 8 + uses: ./.github/actions/setup + - name: Run Unit Tests + uses: ./.github/actions/unit_test_module + with: + module: PayPalMessaging unit_test_samsung_pay: name: SamsungPay Unit Tests runs-on: ubuntu-latest @@ -222,6 +234,7 @@ jobs: unit_test_google_pay, unit_test_local_payment, unit_test_paypal, + unit_test_paypal_messaging, unit_test_samsung_pay, unit_test_three_d_secure, unit_test_union_pay, diff --git a/.github/workflows/release_snapshot.yml b/.github/workflows/release_snapshot.yml index 8f2d149ac5..6d8ad3fefa 100644 --- a/.github/workflows/release_snapshot.yml +++ b/.github/workflows/release_snapshot.yml @@ -125,6 +125,18 @@ jobs: uses: ./.github/actions/unit_test_module with: module: PayPal + unit_test_paypal_messaging: + name: PayPal Messaging Unit Tests + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + - name: Setup Java 8 + uses: ./.github/actions/setup + - name: Run Unit Tests + uses: ./.github/actions/unit_test_module + with: + module: PayPalMessaging unit_test_samsung_pay: name: SamsungPay Unit Tests runs-on: ubuntu-latest @@ -221,6 +233,7 @@ jobs: unit_test_google_pay, unit_test_local_payment, unit_test_paypal, + unit_test_paypal_messaging, unit_test_samsung_pay, unit_test_three_d_secure, unit_test_union_pay, diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt index efc9c4568e..1ed3b8f190 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt @@ -1,4 +1,4 @@ package com.braintreepayments.api.paypalmessaging class PayPalMessagingClient { // TODO: Add functionality in a future PR -} \ No newline at end of file +} diff --git a/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt b/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt index bc3a8ee401..ddaf630eb8 100644 --- a/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt +++ b/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt @@ -1,4 +1,4 @@ package com.braintreepayments.api.paypalmessaging class PayPalMessagingClientUnitTest { // TODO: Add unit tests in a future PR -} \ No newline at end of file +} diff --git a/build.gradle b/build.gradle index f5aecdd266..d404971cae 100644 --- a/build.gradle +++ b/build.gradle @@ -141,6 +141,7 @@ detekt { "LocalPayment/src", "PayPal/src", "PayPalDataCollector/src", + "PayPalMessaging/src", "PayPalNativeCheckout/src", "SEPADirectDebit/src", "SharedUtils/src", From b83c3c06b4ad11e30aad25c845427c6afbbbb7eb Mon Sep 17 00:00:00 2001 From: Jax DesMarais-Leder Date: Thu, 21 Dec 2023 09:31:18 -0600 Subject: [PATCH 03/21] rename PayPalMessagingClient to PayPalMessagingView (#870) --- .../{PayPalMessagingClient.kt => PayPalMessagingView.kt} | 2 +- ...essagingClientUnitTest.kt => PayPalMessagingViewUnitTest.kt} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/{PayPalMessagingClient.kt => PayPalMessagingView.kt} (76%) rename PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/{PayPalMessagingClientUnitTest.kt => PayPalMessagingViewUnitTest.kt} (71%) diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingView.kt similarity index 76% rename from PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt rename to PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingView.kt index 1ed3b8f190..72ab712f67 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClient.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingView.kt @@ -1,4 +1,4 @@ package com.braintreepayments.api.paypalmessaging -class PayPalMessagingClient { +class PayPalMessagingView { // TODO: Add functionality in a future PR } diff --git a/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt b/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingViewUnitTest.kt similarity index 71% rename from PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt rename to PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingViewUnitTest.kt index ddaf630eb8..c11de69775 100644 --- a/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingClientUnitTest.kt +++ b/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingViewUnitTest.kt @@ -1,4 +1,4 @@ package com.braintreepayments.api.paypalmessaging -class PayPalMessagingClientUnitTest { +class PayPalMessagingViewUnitTest { // TODO: Add unit tests in a future PR } From 0b4f2c59af156d44e504987258fabc2000db749f Mon Sep 17 00:00:00 2001 From: Jax DesMarais-Leder Date: Tue, 16 Jan 2024 13:49:47 -0600 Subject: [PATCH 04/21] Add PayPal Messaging Dependency (#888) * add PayPal Messages dependency * update build.grade to reflect min SDK version and import snapshots * add TODO to remove importing snapshots before release * add rootProject.minSdkVersionPayPalMessaging --- PayPalMessaging/build.gradle | 13 ++++++++++++- build.gradle | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/PayPalMessaging/build.gradle b/PayPalMessaging/build.gradle index e48dad4031..a8714f4f17 100644 --- a/PayPalMessaging/build.gradle +++ b/PayPalMessaging/build.gradle @@ -7,7 +7,8 @@ android { compileSdkVersion rootProject.compileSdkVersion defaultConfig { - minSdkVersion rootProject.minSdkVersion + // required to be out of sync with other modules due to messaging SDK min version + minSdkVersion rootProject.minSdkVersionPayPalMessaging targetSdkVersion rootProject.targetSdkVersion testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -40,10 +41,20 @@ dependencies { implementation deps.coreKtx implementation deps.kotlinStdLib implementation deps.appCompat + implementation('com.paypal.messages:paypal-messages:1.0.0-alpha.00-SNAPSHOT') testImplementation deps.junitTest } +// TODO: remove importing snapshot repositories before feature is merged +allprojects { + repositories { + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } + } +} + // region signing and publishing project.ext.name = "paypal-messaging" diff --git a/build.gradle b/build.gradle index d404971cae..4dd3efb4b4 100644 --- a/build.gradle +++ b/build.gradle @@ -102,6 +102,7 @@ group 'com.braintreepayments' ext { compileSdkVersion = 34 minSdkVersion = 21 + minSdkVersionPayPalMessaging = 23 versionCode = 185 targetSdkVersion = 34 versionName = version From f2c225ea40fbd7be17297c2cd0c63c5f3242a86e Mon Sep 17 00:00:00 2001 From: Jax DesMarais-Leder Date: Wed, 24 Jan 2024 11:50:42 -0600 Subject: [PATCH 05/21] Paypal Messaging Implementation (#895) * Add PayPalMessagingRequest, PayPalMessagingColor, PayPalMessagingLogoType, PayPalMessagingOfferType, PayPalMessagingPlacement, PayPalMessagingTextAlignment, and PayPalMessagingListener * Add PayPalMessagingView as the main entry point for merchants --- CHANGELOG.md | 7 ++ PayPalMessaging/build.gradle | 11 +- .../api/PayPalMessagingColor.kt | 37 ++++++ .../api/PayPalMessagingListener.kt | 34 ++++++ .../api/PayPalMessagingLogoType.kt | 37 ++++++ .../api/PayPalMessagingOfferType.kt | 38 ++++++ .../api/PayPalMessagingPlacement.kt | 42 +++++++ .../api/PayPalMessagingRequest.kt | 26 ++++ .../api/PayPalMessagingTextAlignment.kt | 32 +++++ .../api/PayPalMessagingView.kt | 111 ++++++++++++++++++ .../paypalmessaging/PayPalMessagingView.kt | 4 - .../PayPalMessagingViewUnitTest.kt | 3 +- build.gradle | 1 + 13 files changed, 368 insertions(+), 15 deletions(-) create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingColor.kt create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingListener.kt create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingLogoType.kt create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingOfferType.kt create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingPlacement.kt create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingRequest.kt create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingTextAlignment.kt create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt delete mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingView.kt rename PayPalMessaging/src/test/java/com/braintreepayments/api/{paypalmessaging => }/PayPalMessagingViewUnitTest.kt (61%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17141ece3d..56ec2e7594 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Braintree Android SDK Release Notes +## unreleased + +* PayPalMessaging (BETA) + * Add `PayPalMessagingRequest`, `PayPalMessagingColor`, `PayPalMessagingLogoType`, `PayPalMessagingOfferType`, `PayPalMessagingPlacement`, `PayPalMessagingTextAlignment`, and `PayPalMessagingListener` + * Add `PayPalMessagingView` to display PayPal messages to promote offers such as Pay Later and PayPal Credit to customers. + * To get started call `PayPalMessagingView#start(Context)` with an optional `PayPalMessagingRequest` + ## 4.41.0 (2024-01-18) * PayPal diff --git a/PayPalMessaging/build.gradle b/PayPalMessaging/build.gradle index a8714f4f17..4dfc1f833c 100644 --- a/PayPalMessaging/build.gradle +++ b/PayPalMessaging/build.gradle @@ -41,20 +41,11 @@ dependencies { implementation deps.coreKtx implementation deps.kotlinStdLib implementation deps.appCompat - implementation('com.paypal.messages:paypal-messages:1.0.0-alpha.00-SNAPSHOT') + implementation('com.paypal.messages:paypal-messages:1.0.0-alpha.00') testImplementation deps.junitTest } -// TODO: remove importing snapshot repositories before feature is merged -allprojects { - repositories { - maven { - url 'https://oss.sonatype.org/content/repositories/snapshots/' - } - } -} - // region signing and publishing project.ext.name = "paypal-messaging" diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingColor.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingColor.kt new file mode 100644 index 0000000000..26077ff391 --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingColor.kt @@ -0,0 +1,37 @@ +package com.braintreepayments.api + +import com.paypal.messages.config.message.style.PayPalMessageColor + +/** + * Text and logo color option for a PayPal Message + * Note: **This module is in beta. It's public API may change or be removed in future releases.** + */ +enum class PayPalMessagingColor { + /** + * Black text with a color logo + */ + BLACK, + + /** + * White text with a color logo + */ + WHITE, + + /** + * Black text with a black logo + */ + MONOCHROME, + + /** + * Black text with a desaturated logo + */ + GRAYSCALE; + + internal val messageColorRawValue: PayPalMessageColor + get() = when (this) { + BLACK -> PayPalMessageColor.BLACK + WHITE -> PayPalMessageColor.WHITE + MONOCHROME -> PayPalMessageColor.MONOCHROME + GRAYSCALE -> PayPalMessageColor.GRAYSCALE + } +} diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingListener.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingListener.kt new file mode 100644 index 0000000000..839d57b3e6 --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingListener.kt @@ -0,0 +1,34 @@ +package com.braintreepayments.api + +/** + * Callback used to communicate [PayPalMessagingView] events + * Note: **This module is in beta. It's public API may change or be removed in future releases.** + */ +interface PayPalMessagingListener { + + /** + * Called when the user has clicked the [PayPalMessagingView]. + */ + fun onPayPalMessagingClick() + + /** + * Called when the user has begun the PayPal Credit application. + */ + fun onPayPalMessagingApply() + + /** + * Called when the [PayPalMessagingView] is loading. + */ + fun onPayPalMessagingLoading() + + /** + * Called when the [PayPalMessagingView] has rendered successfully. + */ + fun onPayPalMessagingSuccess() + + /** + * Called when there is a failure rendering the [PayPalMessagingView] + * @param error [Exception] explaining the reason for failure. + */ + fun onPayPalMessagingFailure(error: Exception) +} diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingLogoType.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingLogoType.kt new file mode 100644 index 0000000000..c6c721e1df --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingLogoType.kt @@ -0,0 +1,37 @@ +package com.braintreepayments.api + +import com.paypal.messages.config.message.style.PayPalMessageLogoType + +/** + * Logo type option for a PayPal Message + * Note: **This module is in beta. It's public API may change or be removed in future releases.** + */ +enum class PayPalMessagingLogoType { + /** + * Primary logo including both the PayPal monogram and logo + */ + PRIMARY, + + /** + * Alternative logo including just the PayPal monogram + */ + ALTERNATIVE, + + /** + * PayPal logo positioned inline within the message + */ + INLINE, + + /** + * "PayPal" as bold text inline with the message + */ + SIMPLE; + + internal val logoTypeRawValue: PayPalMessageLogoType + get() = when (this) { + PRIMARY -> PayPalMessageLogoType.PRIMARY + ALTERNATIVE -> PayPalMessageLogoType.ALTERNATIVE + INLINE -> PayPalMessageLogoType.INLINE + SIMPLE -> PayPalMessageLogoType.NONE + } +} diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingOfferType.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingOfferType.kt new file mode 100644 index 0000000000..c3e45ae17d --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingOfferType.kt @@ -0,0 +1,38 @@ +package com.braintreepayments.api + +import com.paypal.messages.config.PayPalMessageOfferType + +/** + * Preferred message offer to display + * Note: **This module is in beta. It's public API may change or be removed in future releases.** + */ +enum class PayPalMessagingOfferType { + + /** + * Pay Later short term installment + */ + PAY_LATER_SHORT_TERM, + + /** + * Pay Later long term installments + */ + PAY_LATER_LONG_TERM, + + /** + * Pay Later deferred payment + */ + PAY_LATER_PAY_IN_ONE, + + /** + * PayPal Credit No Interest + */ + PAYPAL_CREDIT_NO_INTEREST; + + internal val offerTypeRawValue: PayPalMessageOfferType + get() = when (this) { + PAY_LATER_SHORT_TERM -> PayPalMessageOfferType.PAY_LATER_SHORT_TERM + PAY_LATER_LONG_TERM -> PayPalMessageOfferType.PAY_LATER_LONG_TERM + PAY_LATER_PAY_IN_ONE -> PayPalMessageOfferType.PAY_LATER_PAY_IN_1 + PAYPAL_CREDIT_NO_INTEREST -> PayPalMessageOfferType.PAYPAL_CREDIT_NO_INTEREST + } +} diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingPlacement.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingPlacement.kt new file mode 100644 index 0000000000..93622688dc --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingPlacement.kt @@ -0,0 +1,42 @@ +package com.braintreepayments.api + +/** + * Message location within an application + * Note: **This module is in beta. It's public API may change or be removed in future releases.** + */ +enum class PayPalMessagingPlacement { + + /** + * Home view + */ + HOME, + + /** + * Category view displaying multiple products + */ + CATEGORY, + + /** + * Individual product view + */ + PRODUCT, + + /** + * Shopping cart view + */ + CART, + + /** + * Checkout view + */ + PAYMENT; + + internal val rawValue: String + get() = when (this) { + HOME -> "HOME" + CATEGORY -> "CATEGORY" + PRODUCT -> "PRODUCT" + CART -> "CART" + PAYMENT -> "PAYMENT" + } +} diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingRequest.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingRequest.kt new file mode 100644 index 0000000000..903918cde7 --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingRequest.kt @@ -0,0 +1,26 @@ +package com.braintreepayments.api + +/** + * Used to initialize a [PayPalMessagingView] + * This feature is currently only supported for buyers located in the US. For merchants domiciled + * outside of the US please set the [buyerCountry] to display messaging to US based buyers. + * Note: **This module is in beta. It's public API may change or be removed in future releases.** + * + * @property amount Price expressed in cents amount based on the current context + * (i.e. individual product price vs total cart price) + * @property placement Message screen location (e.g. product, cart, home) + * @property offerType Preferred message offer to display + * @property buyerCountry Consumer's country (Integrations must be approved by PayPal to use this option) + * @property logoType Logo type option for a PayPal Message. Defaults to [PayPalMessagingLogoType.INLINE] + * @property textAlignment Text alignment option for a PayPal Message. Defaults to [PayPalMessagingTextAlignment.RIGHT] + * @property color Text and logo color option for a PayPal Message. Defaults to [PayPalMessagingColor.BLACK] + */ +data class PayPalMessagingRequest( + var amount: Double? = null, + var placement: PayPalMessagingPlacement? = null, + var offerType: PayPalMessagingOfferType? = null, + var buyerCountry: String? = null, + var logoType: PayPalMessagingLogoType? = PayPalMessagingLogoType.INLINE, + var textAlignment: PayPalMessagingTextAlignment? = PayPalMessagingTextAlignment.RIGHT, + var color: PayPalMessagingColor? = PayPalMessagingColor.BLACK +) diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingTextAlignment.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingTextAlignment.kt new file mode 100644 index 0000000000..ca2a12cec3 --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingTextAlignment.kt @@ -0,0 +1,32 @@ +package com.braintreepayments.api + +import com.paypal.messages.config.message.style.PayPalMessageAlign + +/** + * Text alignment option for a PayPal Message + * Note: **This module is in beta. It's public API may change or be removed in future releases.** + */ +enum class PayPalMessagingTextAlignment { + + /** + * Text aligned to the left + */ + LEFT, + + /** + * Text aligned to the center + */ + CENTER, + + /** + * Text aligned to the right + */ + RIGHT; + + internal val textAlignmentRawValue: PayPalMessageAlign + get() = when (this) { + LEFT -> PayPalMessageAlign.LEFT + CENTER -> PayPalMessageAlign.CENTER + RIGHT -> PayPalMessageAlign.RIGHT + } +} diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt new file mode 100644 index 0000000000..d7c7f60c07 --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt @@ -0,0 +1,111 @@ +package com.braintreepayments.api + +import android.content.Context +import android.view.ViewGroup +import com.paypal.messages.PayPalMessageView +import com.paypal.messages.config.message.PayPalMessageData +import com.paypal.messages.config.PayPalEnvironment +import com.paypal.messages.config.message.PayPalMessageConfig +import com.paypal.messages.config.message.PayPalMessageEventsCallbacks +import com.paypal.messages.config.message.PayPalMessageStyle +import com.paypal.messages.config.message.PayPalMessageViewStateCallbacks + +/** + * Use [PayPalMessagingView] to display PayPal messages to promote offers such as Pay Later + * and PayPal Credit to customers. + * Note: **This module is in beta. It's public API may change or be removed in future releases.** + * @property braintreeClient a {@link BraintreeClient} + */ +class PayPalMessagingView(private val braintreeClient: BraintreeClient) { + var payPalMessagingListener: PayPalMessagingListener? = null + + /** + * Creates a view to be displayed to promote offers such as Pay Later and PayPal Credit to customers. + * @property context the Android Context + * @property request An optional [PayPalMessagingRequest] + * Note: **This module is in beta. It's public API may change or be removed in future releases.** + */ + fun start(context: Context, request: PayPalMessagingRequest = PayPalMessagingRequest()) { + braintreeClient.getConfiguration { configuration, configError -> + if (configError != null) { + payPalMessagingListener?.onPayPalMessagingFailure(configError) + } else if (configuration != null) { + val clientId = configuration.payPalClientId + if (clientId == null) { + val exception = BraintreeException( + "Could not find PayPal client ID in Braintree configuration." + ) + payPalMessagingListener?.onPayPalMessagingFailure(exception) + } else { + val payPalMessageView = constructPayPalMessageView(context, clientId, configuration, request) + payPalMessageView.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + } + } else { + val exception = BraintreeException( + "Fetching Braintree configuration resulted in no error or configuration returned." + ) + payPalMessagingListener?.onPayPalMessagingFailure(exception) + } + } + } + + private fun constructPayPalMessageView( + context: Context, + clientId: String, + configuration: Configuration, + request: PayPalMessagingRequest + ): PayPalMessageView { + val environment = if (configuration.environment == "production") { + PayPalEnvironment.LIVE + } else { + PayPalEnvironment.SANDBOX + } + val messageData = PayPalMessageData( + clientID = clientId, + amount = request.amount, + buyerCountry = request.buyerCountry, + offerType = request.offerType?.offerTypeRawValue, + placement = request.placement?.rawValue, + environment = environment + ) + + val messageStyle = PayPalMessageStyle( + color = request.color?.messageColorRawValue, + logoType = request.logoType?.logoTypeRawValue, + textAlign = request.textAlignment?.textAlignmentRawValue + ) + + val viewStateCallbacks = PayPalMessageViewStateCallbacks( + onLoading = { + payPalMessagingListener?.onPayPalMessagingLoading() + }, + onError = { error -> + payPalMessagingListener?.onPayPalMessagingFailure(error) + }, + onSuccess = { + payPalMessagingListener?.onPayPalMessagingSuccess() + } + ) + + val eventsCallbacks = PayPalMessageEventsCallbacks( + onClick = { + payPalMessagingListener?.onPayPalMessagingClick() + }, + onApply = { + payPalMessagingListener?.onPayPalMessagingApply() + } + ) + + val messageConfig = PayPalMessageConfig( + data = messageData, + style = messageStyle, + viewStateCallbacks = viewStateCallbacks, + eventsCallbacks = eventsCallbacks + ) + + return PayPalMessageView(context = context, config = messageConfig) + } +} diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingView.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingView.kt deleted file mode 100644 index 72ab712f67..0000000000 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingView.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.braintreepayments.api.paypalmessaging -class PayPalMessagingView { - // TODO: Add functionality in a future PR -} diff --git a/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingViewUnitTest.kt b/PayPalMessaging/src/test/java/com/braintreepayments/api/PayPalMessagingViewUnitTest.kt similarity index 61% rename from PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingViewUnitTest.kt rename to PayPalMessaging/src/test/java/com/braintreepayments/api/PayPalMessagingViewUnitTest.kt index c11de69775..79332cf002 100644 --- a/PayPalMessaging/src/test/java/com/braintreepayments/api/paypalmessaging/PayPalMessagingViewUnitTest.kt +++ b/PayPalMessaging/src/test/java/com/braintreepayments/api/PayPalMessagingViewUnitTest.kt @@ -1,4 +1,5 @@ -package com.braintreepayments.api.paypalmessaging +package com.braintreepayments.api + class PayPalMessagingViewUnitTest { // TODO: Add unit tests in a future PR } diff --git a/build.gradle b/build.gradle index 04c352caa4..038029bc69 100644 --- a/build.gradle +++ b/build.gradle @@ -103,6 +103,7 @@ ext { compileSdkVersion = 34 minSdkVersion = 21 minSdkVersionPayPalMessaging = 23 + versionCode = 186 targetSdkVersion = 34 versionName = version } From 550b70e726becde3667a1e53c695ee0b3cfd00bd Mon Sep 17 00:00:00 2001 From: Justin Warmkessel Date: Mon, 29 Jan 2024 12:58:37 -1000 Subject: [PATCH 06/21] Messaging analytics --- .../api/PayPalMessagingAnalytics.kt | 7 +++++++ .../api/PayPalMessagingView.kt | 21 +++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt new file mode 100644 index 0000000000..966b0e8199 --- /dev/null +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt @@ -0,0 +1,7 @@ +package com.braintreepayments.api; + +internal enum class PayPalMessagingAnalytics(val value: String) { + STARTED("paypal-messaging:create-view:started"), + FAILED("paypal-messaging:create-view:failed"), + SUCCEEDED("paypal-messaging:create-view:succeeded"); +} \ No newline at end of file diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt index d7c7f60c07..185ebd3233 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt @@ -9,6 +9,7 @@ import com.paypal.messages.config.message.PayPalMessageConfig import com.paypal.messages.config.message.PayPalMessageEventsCallbacks import com.paypal.messages.config.message.PayPalMessageStyle import com.paypal.messages.config.message.PayPalMessageViewStateCallbacks +import com.paypal.messages.utils.PayPalErrors /** * Use [PayPalMessagingView] to display PayPal messages to promote offers such as Pay Later @@ -26,16 +27,18 @@ class PayPalMessagingView(private val braintreeClient: BraintreeClient) { * Note: **This module is in beta. It's public API may change or be removed in future releases.** */ fun start(context: Context, request: PayPalMessagingRequest = PayPalMessagingRequest()) { + braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.STARTED.value) + braintreeClient.getConfiguration { configuration, configError -> if (configError != null) { - payPalMessagingListener?.onPayPalMessagingFailure(configError) + notifyFailure(error = configError) } else if (configuration != null) { val clientId = configuration.payPalClientId if (clientId == null) { - val exception = BraintreeException( + val clientIdError = BraintreeException( "Could not find PayPal client ID in Braintree configuration." ) - payPalMessagingListener?.onPayPalMessagingFailure(exception) + notifyFailure(error = clientIdError) } else { val payPalMessageView = constructPayPalMessageView(context, clientId, configuration, request) payPalMessageView.layoutParams = ViewGroup.LayoutParams( @@ -44,10 +47,10 @@ class PayPalMessagingView(private val braintreeClient: BraintreeClient) { ) } } else { - val exception = BraintreeException( + val unknownError = BraintreeException( "Fetching Braintree configuration resulted in no error or configuration returned." ) - payPalMessagingListener?.onPayPalMessagingFailure(exception) + notifyFailure(error = unknownError) } } } @@ -83,9 +86,10 @@ class PayPalMessagingView(private val braintreeClient: BraintreeClient) { payPalMessagingListener?.onPayPalMessagingLoading() }, onError = { error -> - payPalMessagingListener?.onPayPalMessagingFailure(error) + notifyFailure(error) }, onSuccess = { + braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.SUCCEEDED.value) payPalMessagingListener?.onPayPalMessagingSuccess() } ) @@ -108,4 +112,9 @@ class PayPalMessagingView(private val braintreeClient: BraintreeClient) { return PayPalMessageView(context = context, config = messageConfig) } + + private fun notifyFailure(error: Exception) { + braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.FAILED.value) + payPalMessagingListener?.onPayPalMessagingFailure(error) + } } From 6bc1708adfd0d2fccb77f7b8353a1f0637cc9541 Mon Sep 17 00:00:00 2001 From: Justin Warmkessel Date: Mon, 5 Feb 2024 14:23:41 -1000 Subject: [PATCH 07/21] Address PR comments --- .../java/com/braintreepayments/api/PayPalMessagingAnalytics.kt | 2 +- .../main/java/com/braintreepayments/api/PayPalMessagingView.kt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt index 966b0e8199..3f60107608 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt @@ -3,5 +3,5 @@ package com.braintreepayments.api; internal enum class PayPalMessagingAnalytics(val value: String) { STARTED("paypal-messaging:create-view:started"), FAILED("paypal-messaging:create-view:failed"), - SUCCEEDED("paypal-messaging:create-view:succeeded"); + SUCCEEDED("paypal-messaging:create-view:succeeded") } \ No newline at end of file diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt index 185ebd3233..14ce0ba818 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt @@ -9,7 +9,6 @@ import com.paypal.messages.config.message.PayPalMessageConfig import com.paypal.messages.config.message.PayPalMessageEventsCallbacks import com.paypal.messages.config.message.PayPalMessageStyle import com.paypal.messages.config.message.PayPalMessageViewStateCallbacks -import com.paypal.messages.utils.PayPalErrors /** * Use [PayPalMessagingView] to display PayPal messages to promote offers such as Pay Later From 8163fd601ede121f2e7171d35b33be4fc738d1f2 Mon Sep 17 00:00:00 2001 From: Justin Warmkessel Date: Tue, 6 Feb 2024 14:04:16 -1000 Subject: [PATCH 08/21] update enum for analytics event names --- .../com/braintreepayments/api/PayPalMessagingAnalytics.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt index 3f60107608..6786abb4c8 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt @@ -1,7 +1,7 @@ package com.braintreepayments.api; -internal enum class PayPalMessagingAnalytics(val value: String) { - STARTED("paypal-messaging:create-view:started"), - FAILED("paypal-messaging:create-view:failed"), - SUCCEEDED("paypal-messaging:create-view:succeeded") +internal object PayPalMessagingAnalytics { + const val STARTED = "paypal-messaging:create-view:started" + const val FAILED = "paypal-messaging:create-view:failed" + const val SUCCEEDED = "paypal-messaging:create-view:succeeded" } \ No newline at end of file From 101aa3c84af4e5a5c1ae8728b686d557ed2d424e Mon Sep 17 00:00:00 2001 From: Justin Warmkessel Date: Wed, 7 Feb 2024 10:07:08 -1000 Subject: [PATCH 09/21] Helper method for onSuccess --- .../java/com/braintreepayments/api/PayPalMessagingView.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt index 14ce0ba818..cf932790ba 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt @@ -88,8 +88,7 @@ class PayPalMessagingView(private val braintreeClient: BraintreeClient) { notifyFailure(error) }, onSuccess = { - braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.SUCCEEDED.value) - payPalMessagingListener?.onPayPalMessagingSuccess() + notifySuccess() } ) @@ -112,6 +111,11 @@ class PayPalMessagingView(private val braintreeClient: BraintreeClient) { return PayPalMessageView(context = context, config = messageConfig) } + private fun notifySuccess() { + braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.SUCCEEDED.value) + payPalMessagingListener?.onPayPalMessagingSuccess() + } + private fun notifyFailure(error: Exception) { braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.FAILED.value) payPalMessagingListener?.onPayPalMessagingFailure(error) From 1ceae11c2d5f34a119f439ac3709febaef7de92c Mon Sep 17 00:00:00 2001 From: Justin Warmkessel Date: Wed, 7 Feb 2024 10:47:54 -1000 Subject: [PATCH 10/21] Adding new line --- .../java/com/braintreepayments/api/PayPalMessagingAnalytics.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt index 6786abb4c8..67396b7661 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt @@ -4,4 +4,4 @@ internal object PayPalMessagingAnalytics { const val STARTED = "paypal-messaging:create-view:started" const val FAILED = "paypal-messaging:create-view:failed" const val SUCCEEDED = "paypal-messaging:create-view:succeeded" -} \ No newline at end of file +} From e2560196a9129ad0c31c4bfa1431d2a26341bdb9 Mon Sep 17 00:00:00 2001 From: Justin Warmkessel Date: Wed, 7 Feb 2024 10:49:28 -1000 Subject: [PATCH 11/21] Remove .value --- .../java/com/braintreepayments/api/PayPalMessagingView.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt index cf932790ba..a5bf2407ec 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingView.kt @@ -26,7 +26,7 @@ class PayPalMessagingView(private val braintreeClient: BraintreeClient) { * Note: **This module is in beta. It's public API may change or be removed in future releases.** */ fun start(context: Context, request: PayPalMessagingRequest = PayPalMessagingRequest()) { - braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.STARTED.value) + braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.STARTED) braintreeClient.getConfiguration { configuration, configError -> if (configError != null) { @@ -112,12 +112,12 @@ class PayPalMessagingView(private val braintreeClient: BraintreeClient) { } private fun notifySuccess() { - braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.SUCCEEDED.value) + braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.SUCCEEDED) payPalMessagingListener?.onPayPalMessagingSuccess() } private fun notifyFailure(error: Exception) { - braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.FAILED.value) + braintreeClient.sendAnalyticsEvent(PayPalMessagingAnalytics.FAILED) payPalMessagingListener?.onPayPalMessagingFailure(error) } } From 323f6a12ee1a35bd6c6f2b8e4d5780115a39a3b3 Mon Sep 17 00:00:00 2001 From: Justin Warmkessel Date: Wed, 7 Feb 2024 10:57:20 -1000 Subject: [PATCH 12/21] Remove semicolon on package --- .../java/com/braintreepayments/api/PayPalMessagingAnalytics.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt index 67396b7661..4bab8cc50e 100644 --- a/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt +++ b/PayPalMessaging/src/main/java/com/braintreepayments/api/PayPalMessagingAnalytics.kt @@ -1,4 +1,4 @@ -package com.braintreepayments.api; +package com.braintreepayments.api internal object PayPalMessagingAnalytics { const val STARTED = "paypal-messaging:create-view:started" From d80a369af59cb91ef417755a361a751a5a586e60 Mon Sep 17 00:00:00 2001 From: Jax DesMarais-Leder Date: Fri, 9 Feb 2024 13:11:11 -0600 Subject: [PATCH 13/21] Add PayPal Messaging Feature to Demo App (#915) * Add PayPalMessagingFragment to Demo app * Add button to demo app to select this feature * Implement PayPalMessagingView * Update PayPalMessagingView method and subclass FrameLayout so the class is a view type * Move context to constructor vs in start method as it is needed for FrameLayout subclass * Update CHANGELOG with these changes --- CHANGELOG.md | 4 +- Demo/build.gradle | 3 + .../braintreepayments/demo/MainFragment.java | 8 +++ .../demo/PayPalMessagingFragment.kt | 68 +++++++++++++++++++ Demo/src/main/res/layout/fragment_main.xml | 8 +++ .../res/layout/fragment_paypal_messaging.xml | 10 +++ Demo/src/main/res/navigation/nav_graph.xml | 8 +++ Demo/src/main/res/values/strings.xml | 1 + .../api/PayPalMessagingView.kt | 12 +++- 9 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 Demo/src/main/java/com/braintreepayments/demo/PayPalMessagingFragment.kt create mode 100644 Demo/src/main/res/layout/fragment_paypal_messaging.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 56ec2e7594..15ffd59f99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,8 @@ * PayPalMessaging (BETA) * Add `PayPalMessagingRequest`, `PayPalMessagingColor`, `PayPalMessagingLogoType`, `PayPalMessagingOfferType`, `PayPalMessagingPlacement`, `PayPalMessagingTextAlignment`, and `PayPalMessagingListener` - * Add `PayPalMessagingView` to display PayPal messages to promote offers such as Pay Later and PayPal Credit to customers. - * To get started call `PayPalMessagingView#start(Context)` with an optional `PayPalMessagingRequest` + * Add `PayPalMessagingView(BraintreeClient, Context)` to display PayPal messages to promote offers such as Pay Later and PayPal Credit to customers. + * To get started call `PayPalMessagingView#start()` with an optional `PayPalMessagingRequest` ## 4.41.0 (2024-01-18) diff --git a/Demo/build.gradle b/Demo/build.gradle index 53ae2c7872..c8d2ade255 100644 --- a/Demo/build.gradle +++ b/Demo/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'androidx.navigation.safeargs' + id 'kotlin-android' } android { @@ -75,6 +76,7 @@ android { dependencies { implementation 'androidx.preference:preference:1.1.1' + implementation deps.kotlinStdLib implementation('com.squareup.retrofit:retrofit:1.9.0') { exclude module: 'com.google.gson' @@ -86,6 +88,7 @@ dependencies { implementation project(':GooglePay') implementation project(':LocalPayment') implementation project(':PayPal') + implementation project(':PayPalMessaging') implementation project(':PayPalNativeCheckout') implementation project(':SamsungPay') implementation project(':SEPADirectDebit') diff --git a/Demo/src/main/java/com/braintreepayments/demo/MainFragment.java b/Demo/src/main/java/com/braintreepayments/demo/MainFragment.java index 06dbcb1e67..d8db7558fc 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/MainFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/MainFragment.java @@ -37,6 +37,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c Button samsungButton = view.findViewById(R.id.samsung_pay); Button sepaDirectDebitButton = view.findViewById(R.id.sepa_debit); Button payPalNativeCheckoutButton = view.findViewById(R.id.paypal_native_checkout); + Button payPalMessagingButton = view.findViewById(R.id.paypal_messaging); cardsButton.setOnClickListener(this::launchCards); payPalButton.setOnClickListener(this::launchPayPal); @@ -47,6 +48,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c samsungButton.setOnClickListener(this::launchSamsungPay); payPalNativeCheckoutButton.setOnClickListener(this::launchPayPalNativeCheckout); sepaDirectDebitButton.setOnClickListener(this::launchSEPADirectDebit); + payPalMessagingButton.setOnClickListener(this::launchPayPalMessaging); return view; } @@ -126,4 +128,10 @@ public void launchSEPADirectDebit(View v) { NavDirections action = MainFragmentDirections.actionMainFragmentToSepaDirectDebitFragment(); Navigation.findNavController(v).navigate(action); } + + public void launchPayPalMessaging(View v) { + NavDirections action = + MainFragmentDirections.actionMainFragmentToPayPalMessagingFragment(); + Navigation.findNavController(v).navigate(action); + } } diff --git a/Demo/src/main/java/com/braintreepayments/demo/PayPalMessagingFragment.kt b/Demo/src/main/java/com/braintreepayments/demo/PayPalMessagingFragment.kt new file mode 100644 index 0000000000..23f9c42316 --- /dev/null +++ b/Demo/src/main/java/com/braintreepayments/demo/PayPalMessagingFragment.kt @@ -0,0 +1,68 @@ +package com.braintreepayments.demo + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import com.braintreepayments.api.PayPalMessagingListener +import com.braintreepayments.api.PayPalMessagingLogoType +import com.braintreepayments.api.PayPalMessagingOfferType +import com.braintreepayments.api.PayPalMessagingRequest +import com.braintreepayments.api.PayPalMessagingTextAlignment +import com.braintreepayments.api.PayPalMessagingView + +class PayPalMessagingFragment : BaseFragment(), PayPalMessagingListener { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_paypal_messaging, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val payPalMessagingRequest = PayPalMessagingRequest( + amount = 2.0, + placement = null, + offerType = PayPalMessagingOfferType.PAY_LATER_LONG_TERM, + buyerCountry = "US", + logoType = PayPalMessagingLogoType.PRIMARY, + textAlignment = PayPalMessagingTextAlignment.CENTER, + color = null + ) + + val payPalMessagingView = PayPalMessagingView(braintreeClient, requireActivity()) + payPalMessagingView.payPalMessagingListener = this + payPalMessagingView.start(payPalMessagingRequest) + payPalMessagingView.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + + val messagingView: LinearLayout = view.findViewById(R.id.content) + messagingView.addView(payPalMessagingView) + } + + override fun onPayPalMessagingClick() { + println("User clicked on the PayPalMessagingView") + } + + override fun onPayPalMessagingApply() { + println("User is attempting to apply for PayPal Credit") + } + + override fun onPayPalMessagingLoading() { + println("Loading PayPalMessagingView") + } + + override fun onPayPalMessagingSuccess() { + println("PayPalMessagingView displayed to user") + } + + override fun onPayPalMessagingFailure(error: Exception) { + println("PayPalMessagingView returned the error:" + error.message) + } +} diff --git a/Demo/src/main/res/layout/fragment_main.xml b/Demo/src/main/res/layout/fragment_main.xml index 23f8e388bd..35714d5f10 100644 --- a/Demo/src/main/res/layout/fragment_main.xml +++ b/Demo/src/main/res/layout/fragment_main.xml @@ -23,6 +23,14 @@ android:text="@string/cards" android:textSize="12sp" /> +