From dd75e30266f1c9a957bcc57323fb14f8a6581576 Mon Sep 17 00:00:00 2001 From: Ravi Shekhar Date: Wed, 11 Sep 2024 16:31:18 -0500 Subject: [PATCH] Android Example with Custom Tabs (#3) * Add android example * Fix cancel url * Update AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/CatalogFragment.java Co-authored-by: Jax DesMarais-Leder * Update AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/CatalogFragment.java Co-authored-by: Jax DesMarais-Leder * Update AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/ShoppingCartFragment.java Co-authored-by: Tim Chow * Update AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/ShoppingCartFragment.java Co-authored-by: Tim Chow * remove auto generated codes and extraneous super invocation * Use liner layout instead of constrained layout and remove PayPal.com button * Remove wrapping of single widgets inside layouts, use linear layout instead of app bar * Use const for urls --------- Co-authored-by: Jax DesMarais-Leder Co-authored-by: Tim Chow --- .../.gitignore | 14 ++ .../app/build.gradle | 43 ++++ .../app/src/main/AndroidManifest.xml | 51 +++++ .../CatalogFragment.java | 35 ++++ .../MainActivity.java | 38 ++++ .../OnPaymentCompletionActivity.java | 51 +++++ .../ShoppingCartFragment.java | 88 +++++++++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 30 +++ .../app/src/main/res/layout/activity_main.xml | 24 +++ .../layout/activity_on_payment_completion.xml | 59 ++++++ .../app/src/main/res/layout/content_main.xml | 19 ++ .../src/main/res/layout/fragment_catalog.xml | 19 ++ .../res/layout/fragment_shopping_cart.xml | 43 ++++ .../main/res/mipmap-anydpi/ic_launcher.xml | 6 + .../res/mipmap-anydpi/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes .../app/src/main/res/navigation/nav_graph.xml | 28 +++ .../app/src/main/res/values-land/dimens.xml | 3 + .../app/src/main/res/values-night/themes.xml | 7 + .../app/src/main/res/values-v23/themes.xml | 9 + .../src/main/res/values-w1240dp/dimens.xml | 3 + .../app/src/main/res/values-w600dp/dimens.xml | 3 + .../app/src/main/res/values/colors.xml | 5 + .../app/src/main/res/values/dimens.xml | 8 + .../app/src/main/res/values/strings.xml | 43 ++++ .../app/src/main/res/values/themes.xml | 9 + .../build.gradle | 4 + .../gradle.properties | 21 ++ AndroidPayPalWebSdkIntegrationExample/gradlew | 185 ++++++++++++++++++ .../gradlew.bat | 89 +++++++++ .../settings.gradle | 17 ++ 41 files changed, 1130 insertions(+) create mode 100644 AndroidPayPalWebSdkIntegrationExample/.gitignore create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/build.gradle create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/AndroidManifest.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/CatalogFragment.java create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/MainActivity.java create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/OnPaymentCompletionActivity.java create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/ShoppingCartFragment.java create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/activity_main.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/activity_on_payment_completion.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/content_main.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/fragment_catalog.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/fragment_shopping_cart.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-anydpi/ic_launcher.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/navigation/nav_graph.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/values-land/dimens.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/values-night/themes.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/values-v23/themes.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/values-w1240dp/dimens.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/values-w600dp/dimens.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/values/colors.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/values/dimens.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/values/strings.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/app/src/main/res/values/themes.xml create mode 100644 AndroidPayPalWebSdkIntegrationExample/build.gradle create mode 100644 AndroidPayPalWebSdkIntegrationExample/gradle.properties create mode 100755 AndroidPayPalWebSdkIntegrationExample/gradlew create mode 100644 AndroidPayPalWebSdkIntegrationExample/gradlew.bat create mode 100644 AndroidPayPalWebSdkIntegrationExample/settings.gradle diff --git a/AndroidPayPalWebSdkIntegrationExample/.gitignore b/AndroidPayPalWebSdkIntegrationExample/.gitignore new file mode 100644 index 0000000..2594906 --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +gradle/ +*.jar +/build +/app/build \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/build.gradle b/AndroidPayPalWebSdkIntegrationExample/app/build.gradle new file mode 100644 index 0000000..4324f9f --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/build.gradle @@ -0,0 +1,43 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.example.androidpaypalwebsdkintegrationexample' + compileSdk 33 + + defaultConfig { + applicationId "com.example.androidpaypalwebsdkintegrationexample" + minSdk 33 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + buildFeatures { + viewBinding true + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'com.google.android.material:material:1.8.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.navigation:navigation-fragment:2.5.3' + implementation 'androidx.navigation:navigation-ui:2.5.3' + implementation 'androidx.browser:browser:1.5.0' + implementation 'androidx.core:core:1.1.0' +} \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/AndroidManifest.xml b/AndroidPayPalWebSdkIntegrationExample/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..bd44074 --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/AndroidManifest.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/CatalogFragment.java b/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/CatalogFragment.java new file mode 100644 index 0000000..1eecc83 --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/CatalogFragment.java @@ -0,0 +1,35 @@ +package com.example.androidpaypalwebsdkintegrationexample; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.example.androidpaypalwebsdkintegrationexample.databinding.FragmentCatalogBinding; + +/** + * This Fragment is a sample fragment to demonstrate a view to host the fully Catalog of products + * the merchant's android app may be offering. + */ +public class CatalogFragment extends Fragment { + + private FragmentCatalogBinding binding; + + @Override + public View onCreateView( + LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState + ) { + binding = FragmentCatalogBinding.inflate(inflater, container, false); + return binding.getRoot(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/MainActivity.java b/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/MainActivity.java new file mode 100644 index 0000000..70681ea --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/MainActivity.java @@ -0,0 +1,38 @@ +package com.example.androidpaypalwebsdkintegrationexample; + +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.ui.AppBarConfiguration; +import androidx.navigation.ui.NavigationUI; + +import com.example.androidpaypalwebsdkintegrationexample.databinding.ActivityMainBinding; + +public class MainActivity extends AppCompatActivity { + + private AppBarConfiguration appBarConfiguration; + private ActivityMainBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityMainBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + setSupportActionBar(binding.toolbar); + + NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); + appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); + NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration); + } + + @Override + public boolean onSupportNavigateUp() { + NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); + return NavigationUI.navigateUp(navController, appBarConfiguration) + || super.onSupportNavigateUp(); + } +} \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/OnPaymentCompletionActivity.java b/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/OnPaymentCompletionActivity.java new file mode 100644 index 0000000..6cf19f2 --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/OnPaymentCompletionActivity.java @@ -0,0 +1,51 @@ +package com.example.androidpaypalwebsdkintegrationexample; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.widget.TextView; + +import com.example.androidpaypalwebsdkintegrationexample.databinding.ActivityOnPaymentCompletionBinding; + +import org.json.JSONObject; + +/** + * This is a sample activity which demonstrates an example payment success activity page. + * This Activity should be invoked after the buyer has reviewed and approved their payment + * on web application hosted by merchant. + * The web application should use payment methods like PayPal, Braintree to collect payments from buyer + */ +public class OnPaymentCompletionActivity extends AppCompatActivity { + private ActivityOnPaymentCompletionBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_on_payment_completion); + binding = ActivityOnPaymentCompletionBinding.inflate(getLayoutInflater()); + // get can also get the appLinkIntent using getIntent() to retrieve any associated data + } + + @Override + protected void onStart() { + super.onStart(); + Uri uri = getIntent().getData(); + String payPalOrderID = null; + + if (uri != null) { + payPalOrderID = uri.getQueryParameter("payPalOrderID"); + Log.i("OnPayment", "onStart payPalOrderID = " + payPalOrderID); + } else { + Log.i("OnPayment", "onStart No payPalOrderID Found"); + } + + TextView textView = (TextView) findViewById(R.id.payPalOrderId); + textView.setText(payPalOrderID); + + // Fetch the PayPal Order Details from your REST APIs. The REST APIs should only exposes minimal data as required by your APP. + // You should also capture or authorize the amounts before fulfilling the buyer order. + } +} \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/ShoppingCartFragment.java b/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/ShoppingCartFragment.java new file mode 100644 index 0000000..5d336ed --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/java/com/example/androidpaypalwebsdkintegrationexample/ShoppingCartFragment.java @@ -0,0 +1,88 @@ +package com.example.androidpaypalwebsdkintegrationexample; + +import android.net.Uri; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.browser.customtabs.CustomTabsIntent; +import androidx.fragment.app.Fragment; +import androidx.navigation.fragment.NavHostFragment; + +import com.example.androidpaypalwebsdkintegrationexample.databinding.FragmentShoppingCartBinding; + +/** + * This Fragment demonstrates a sample shopping cart fragment which should be rendered after buyer + * has added items to their cart and clicks shopping cart button. + * This view should also render a list of selected payment methods like PayPal and link / button to + * view full list of all available payment options. + *

+ * This example demonstrates two buttons, + * 1. Render a PayPal Web SDK integration and Orders API using a Chrome Custom Tab + * 2. Render a PayPal Checkout integration using Orders API. + *

+ * The buttons rendered on this page takes the buyers to a web application hosted by merchant which should + * lists down payment methods available, e.g. PayPal. + *

+ * When the buyer clicks the PayPal button inside the Chrome Custom tab, they would be redirected + * to PayPal.com to review and approve their payment. + * After they approve the payment on PayPal.com, they would be taken back to the web application + * hosted by the merchant. + *

+ * The web application needs to render a redirect button which should take the buyers back to this + * Android App using App Links/Deep Links. + */ +public class ShoppingCartFragment extends Fragment { + + private final String merchantHostedCheckoutWebUrlSpb = "https://shipping-change-sandbox-e66e294a9266.herokuapp.com/buttons.html?onApproveUrl=https://shipping-change-sandbox-e66e294a9266.herokuapp.com/onsuccess/&onCancelUrl=https://shipping-change-sandbox-e66e294a9266.herokuapp.com/redirect-to-app/oncancel/"; + private final String merchantHostedCheckoutWebUrlApi = "https://shipping-change-sandbox-e66e294a9266.herokuapp.com/api-integration.html?onApproveUrl=https://shipping-change-sandbox-e66e294a9266.herokuapp.com/onsuccess/&onCancelUrl=https://shipping-change-sandbox-e66e294a9266.herokuapp.com/redirect-to-app/oncancel/"; + + private FragmentShoppingCartBinding binding; + + @Override + public View onCreateView( + LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState + ) { + + binding = FragmentShoppingCartBinding.inflate(inflater, container, false); + return binding.getRoot(); + + } + + public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + Uri payPalSpbUrl = Uri.parse(merchantHostedCheckoutWebUrlSpb); + Uri payPalApiCheckoutUrl = Uri.parse(merchantHostedCheckoutWebUrlApi); + CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build(); + + binding.checkoutButtonPaypalSpb.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + customTabsIntent.launchUrl(binding.getRoot().getContext(), payPalSpbUrl); + } + }); + binding.checkoutButtonPaypalApi.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + customTabsIntent.launchUrl(binding.getRoot().getContext(), payPalApiCheckoutUrl); + } + }); + binding.productCatalogButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + NavHostFragment.findNavController(ShoppingCartFragment.this) + .navigate(R.id.action_ShoppingCartFragment_to_CatalogFragment); + } + }); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/drawable/ic_launcher_background.xml b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/drawable/ic_launcher_foreground.xml b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/activity_main.xml b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..59c93f9 --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/activity_on_payment_completion.xml b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/activity_on_payment_completion.xml new file mode 100644 index 0000000..422191b --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/activity_on_payment_completion.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/content_main.xml b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000..e416e1c --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/content_main.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/fragment_catalog.xml b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/fragment_catalog.xml new file mode 100644 index 0000000..df84855 --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/fragment_catalog.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/fragment_shopping_cart.xml b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/fragment_shopping_cart.xml new file mode 100644 index 0000000..937d0d4 --- /dev/null +++ b/AndroidPayPalWebSdkIntegrationExample/app/src/main/res/layout/fragment_shopping_cart.xml @@ -0,0 +1,43 @@ + + + + + +