diff --git a/AmericanExpress/src/main/java/com/braintreepayments/api/AmericanExpressClient.java b/AmericanExpress/src/main/java/com/braintreepayments/api/AmericanExpressClient.java index e02bf7584a..94eba2095f 100644 --- a/AmericanExpress/src/main/java/com/braintreepayments/api/AmericanExpressClient.java +++ b/AmericanExpress/src/main/java/com/braintreepayments/api/AmericanExpressClient.java @@ -1,8 +1,10 @@ package com.braintreepayments.api; +import android.content.Context; import android.net.Uri; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import org.json.JSONException; @@ -16,7 +18,17 @@ public class AmericanExpressClient { private final BraintreeClient braintreeClient; - public AmericanExpressClient(@NonNull BraintreeClient braintreeClient) { + /** + * Initializes a new {@link AmericanExpressClient} instance + * + * @param context an Android Context + * @param authorization a Tokenization Key or Client Token used to authenticate + */ + public AmericanExpressClient(@NonNull Context context, @NonNull String authorization) { + this.braintreeClient = new BraintreeClient(context, authorization); + } + + @VisibleForTesting AmericanExpressClient(@NonNull BraintreeClient braintreeClient) { this.braintreeClient = braintreeClient; } diff --git a/BraintreeCore/src/main/java/com/braintreepayments/api/BraintreeClient.kt b/BraintreeCore/src/main/java/com/braintreepayments/api/BraintreeClient.kt index 5a29a5b628..28f97fa1b6 100644 --- a/BraintreeCore/src/main/java/com/braintreepayments/api/BraintreeClient.kt +++ b/BraintreeCore/src/main/java/com/braintreepayments/api/BraintreeClient.kt @@ -13,6 +13,7 @@ import com.braintreepayments.api.IntegrationType.Integration * Core Braintree class that handles network requests. */ @Suppress("LargeClass", "LongParameterList", "TooManyFunctions") +@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) open class BraintreeClient @VisibleForTesting internal constructor( /** @@ -76,6 +77,7 @@ open class BraintreeClient @VisibleForTesting internal constructor( * @param authorization The tokenization key or client token to use. If an invalid authorization * is provided, a [BraintreeException] will be returned via callback. */ + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) constructor(context: Context, authorization: String) : this(BraintreeOptions(context = context, initialAuthString = authorization)) @@ -86,6 +88,7 @@ open class BraintreeClient @VisibleForTesting internal constructor( * @param clientTokenProvider An implementation of [ClientTokenProvider] that [BraintreeClient] * will use to fetch a client token on demand. */ + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) constructor(context: Context, clientTokenProvider: ClientTokenProvider) : this(BraintreeOptions(context = context, clientTokenProvider = clientTokenProvider)) @@ -104,7 +107,8 @@ open class BraintreeClient @VisibleForTesting internal constructor( * authorization is provided, a [BraintreeException] will be returned via callback. * @param returnUrlScheme A custom return url to use for browser and app switching */ - constructor (context: Context, authorization: String, returnUrlScheme: String) : this( + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) + constructor (context: Context, authorization: String, returnUrlScheme: String?) : this( BraintreeOptions( context = context, initialAuthString = authorization, @@ -127,6 +131,7 @@ open class BraintreeClient @VisibleForTesting internal constructor( * will use to fetch a client token on demand. * @param returnUrlScheme A custom return url to use for browser and app switching */ + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) constructor( context: Context, clientTokenProvider: ClientTokenProvider, diff --git a/CHANGELOG.md b/CHANGELOG.md index 02223a32ce..ecb6590c4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ * All Modules * Bump `minSdkVersion` to API 23 * Bump target Java version to Java 11 + * Remove `BraintreeClient` public constructors + * Update payment method constructor parameters from `braintreeClient` to `context` and + `authorization` * Remove `BraintreeSharedPreferencesException` * UnionPay * Remove `union-pay` module diff --git a/Card/src/main/java/com/braintreepayments/api/CardClient.java b/Card/src/main/java/com/braintreepayments/api/CardClient.java index 9bf53515bf..5c23f6722a 100644 --- a/Card/src/main/java/com/braintreepayments/api/CardClient.java +++ b/Card/src/main/java/com/braintreepayments/api/CardClient.java @@ -1,5 +1,7 @@ package com.braintreepayments.api; +import android.content.Context; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -17,7 +19,18 @@ public class CardClient { private final BraintreeClient braintreeClient; private final ApiClient apiClient; - public CardClient(@NonNull BraintreeClient braintreeClient) { + /** + * Initializes a new {@link CardClient} instance + * + * @param context an Android Context + * @param authorization a Tokenization Key or Client Token used to authenticate + */ + public CardClient(@NonNull Context context, @NonNull String authorization) { + this(new BraintreeClient(context, authorization)); + } + + @VisibleForTesting + CardClient(@NonNull BraintreeClient braintreeClient) { this(braintreeClient, new ApiClient(braintreeClient)); } diff --git a/DataCollector/src/main/java/com/braintreepayments/api/DataCollector.java b/DataCollector/src/main/java/com/braintreepayments/api/DataCollector.java index 6ea72a572e..57897eceec 100644 --- a/DataCollector/src/main/java/com/braintreepayments/api/DataCollector.java +++ b/DataCollector/src/main/java/com/braintreepayments/api/DataCollector.java @@ -22,7 +22,18 @@ public class DataCollector { private final UUIDHelper uuidHelper; private final BraintreeClient braintreeClient; - public DataCollector(@NonNull BraintreeClient braintreeClient) { + /** + * Initializes a new {@link DataCollector} instance + * + * @param context an Android Context + * @param authorization a Tokenization Key or Client Token used to authenticate + */ + public DataCollector(@NonNull Context context, @NonNull String authorization) { + this(new BraintreeClient(context, authorization)); + } + + @VisibleForTesting + DataCollector(@NonNull BraintreeClient braintreeClient) { this(braintreeClient, new MagnesInternalClient(), new UUIDHelper()); } diff --git a/Demo/src/main/java/com/braintreepayments/demo/BaseFragment.java b/Demo/src/main/java/com/braintreepayments/demo/BaseFragment.java index 9710255f28..434aae9a29 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/BaseFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/BaseFragment.java @@ -6,9 +6,10 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; -import com.braintreepayments.api.BraintreeClient; import com.braintreepayments.api.PaymentMethodNonce; +import java.util.Objects; + public abstract class BaseFragment extends Fragment { @CallSuper @@ -47,11 +48,15 @@ protected void showDialog(String message) { } } - protected BraintreeClient getBraintreeClient() { + + protected void fetchAuthorization(BraintreeAuthorizationCallback callback) { DemoActivity demoActivity = getDemoActivity(); if (demoActivity != null) { - return demoActivity.getBraintreeClient(); + demoActivity.fetchAuthorization(callback); } - return null; + } + + String getAuthStringArg() { + return Objects.requireNonNull(requireArguments().getString("authString")); } } diff --git a/Demo/src/main/java/com/braintreepayments/demo/BraintreeAuthorizationCallback.java b/Demo/src/main/java/com/braintreepayments/demo/BraintreeAuthorizationCallback.java new file mode 100644 index 0000000000..ce5f887396 --- /dev/null +++ b/Demo/src/main/java/com/braintreepayments/demo/BraintreeAuthorizationCallback.java @@ -0,0 +1,10 @@ +package com.braintreepayments.demo; + +import androidx.annotation.NonNull; + +import com.braintreepayments.api.Authorization; +import com.braintreepayments.api.BraintreeClient; + +public interface BraintreeAuthorizationCallback { + void onResult(@NonNull String authString); +} diff --git a/Demo/src/main/java/com/braintreepayments/demo/BraintreeClientCallback.java b/Demo/src/main/java/com/braintreepayments/demo/BraintreeClientCallback.java deleted file mode 100644 index 3515ac0254..0000000000 --- a/Demo/src/main/java/com/braintreepayments/demo/BraintreeClientCallback.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.braintreepayments.demo; - -import androidx.annotation.NonNull; - -import com.braintreepayments.api.BraintreeClient; - -// NEXT MAJOR VERSION: remove -public interface BraintreeClientCallback { - void onResult(@NonNull BraintreeClient braintreeClient); -} diff --git a/Demo/src/main/java/com/braintreepayments/demo/BraintreeClientFactory.java b/Demo/src/main/java/com/braintreepayments/demo/BraintreeClientFactory.java index 43a5f27541..7ddd27b4c5 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/BraintreeClientFactory.java +++ b/Demo/src/main/java/com/braintreepayments/demo/BraintreeClientFactory.java @@ -7,7 +7,5 @@ // TODO: remove when AuthorizationProvider is released public class BraintreeClientFactory { - static public BraintreeClient createBraintreeClientWithAuthorizationProvider(Context context) { - return new BraintreeClient(context, new DemoClientTokenProvider(context)); - } + } diff --git a/Demo/src/main/java/com/braintreepayments/demo/CardFragment.java b/Demo/src/main/java/com/braintreepayments/demo/CardFragment.java index 398668fda6..5b6cb5fd4b 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/CardFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/CardFragment.java @@ -17,7 +17,6 @@ import com.braintreepayments.api.AmericanExpressClient; import com.braintreepayments.api.AmericanExpressRewardsBalance; -import com.braintreepayments.api.BraintreeClient; import com.braintreepayments.api.Card; import com.braintreepayments.api.CardClient; import com.braintreepayments.api.CardNonce; @@ -71,12 +70,11 @@ public class CardFragment extends BaseFragment implements OnCardFormSubmitListen public void onCreate(Bundle onSaveInstanceState) { super.onCreate(onSaveInstanceState); - BraintreeClient braintreeClient = getBraintreeClient(); - americanExpressClient = new AmericanExpressClient(braintreeClient); - cardClient = new CardClient(braintreeClient); - threeDSecureClient = new ThreeDSecureClient(braintreeClient); + americanExpressClient = new AmericanExpressClient(requireContext(), super.getAuthStringArg()); + cardClient = new CardClient(requireContext(), super.getAuthStringArg()); + threeDSecureClient = new ThreeDSecureClient(requireContext(), super.getAuthStringArg()); - dataCollector = new DataCollector(braintreeClient); + dataCollector = new DataCollector(requireContext(), super.getAuthStringArg()); if (onSaveInstanceState != null) { threeDSecureRequested = onSaveInstanceState.getBoolean(EXTRA_THREE_D_SECURE_REQUESTED); @@ -126,26 +124,20 @@ public void onSaveInstanceState(Bundle outState) { private void configureCardForm() { final AppCompatActivity activity = (AppCompatActivity) getActivity(); - BraintreeClient braintreeClient = getBraintreeClient(); - - braintreeClient.getConfiguration((configuration, configError) -> { - if (configuration != null) { - cardForm.cardRequired(true) - .expirationRequired(true) - .cvvRequired(configuration.isCvvChallengePresent()) - .postalCodeRequired(configuration.isPostalCodeChallengePresent()) - .mobileNumberRequired(false) - .actionLabel(cardFormActionLabel) - .setup(activity); - - if (getArguments().getBoolean(MainFragment.EXTRA_COLLECT_DEVICE_DATA, false)) { - dataCollector.collectDeviceData(activity, - (deviceData, e) -> this.deviceData = deviceData); - } - } else { - handleError(configError); - } - }); + + // TODO: Configure card form via settings + cardForm.cardRequired(true) + .expirationRequired(true) + .cvvRequired(true) + .postalCodeRequired(true) + .mobileNumberRequired(false) + .actionLabel(cardFormActionLabel) + .setup(activity); + + if (getArguments().getBoolean(MainFragment.EXTRA_COLLECT_DEVICE_DATA, false)) { + dataCollector.collectDeviceData(activity, + (deviceData, e) -> this.deviceData = deviceData); + } } @Override diff --git a/Demo/src/main/java/com/braintreepayments/demo/DemoActivity.java b/Demo/src/main/java/com/braintreepayments/demo/DemoActivity.java index 824860bc28..b27d62a73b 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/DemoActivity.java +++ b/Demo/src/main/java/com/braintreepayments/demo/DemoActivity.java @@ -20,16 +20,16 @@ import androidx.navigation.ui.AppBarConfiguration; import androidx.navigation.ui.NavigationUI; -import com.braintreepayments.api.BraintreeClient; import java.util.Arrays; import java.util.List; public class DemoActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback, ActionBar.OnNavigationListener { - private BraintreeClient braintreeClient; private AppBarConfiguration appBarConfiguration; + private DemoClientTokenProvider clientTokenProvider; + private SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener; @Override @@ -37,6 +37,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.activity_demo); + clientTokenProvider = new DemoClientTokenProvider(this); setupActionBar(); setProgressBarIndeterminateVisibility(true); @@ -44,18 +45,8 @@ protected void onCreate(Bundle savedInstanceState) { registerSharedPreferencesListener(); } - public BraintreeClient getBraintreeClient() { - // lazily instantiate braintree client in case the demo has been reset - if (braintreeClient == null) { - if (Settings.useTokenizationKey(this)) { - String tokenizationKey = Settings.getTokenizationKey(this); - braintreeClient = new BraintreeClient(this, tokenizationKey); - } else { - braintreeClient = - BraintreeClientFactory.createBraintreeClientWithAuthorizationProvider(this); - } - } - return braintreeClient; + public void fetchAuthorization(BraintreeAuthorizationCallback callback) { + clientTokenProvider.getClientToken(callback); } @Override @@ -104,7 +95,6 @@ public boolean onSupportNavigateUp() { private void performReset() { setProgressBarIndeterminateVisibility(true); - braintreeClient = null; } public void showDialog(String message) { diff --git a/Demo/src/main/java/com/braintreepayments/demo/DemoClientTokenProvider.java b/Demo/src/main/java/com/braintreepayments/demo/DemoClientTokenProvider.java index cc47f59e37..33deaf92ad 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/DemoClientTokenProvider.java +++ b/Demo/src/main/java/com/braintreepayments/demo/DemoClientTokenProvider.java @@ -11,7 +11,7 @@ import com.braintreepayments.demo.R; import com.braintreepayments.demo.Settings; -public class DemoClientTokenProvider implements ClientTokenProvider { +public class DemoClientTokenProvider { private final Merchant merchant; private final Context appContext; @@ -21,15 +21,14 @@ public DemoClientTokenProvider(Context context) { appContext = context.getApplicationContext(); } - @Override - public void getClientToken(@NonNull ClientTokenCallback callback) { + public void getClientToken(@NonNull BraintreeAuthorizationCallback callback) { String authType = Settings.getAuthorizationType(appContext); if (authType.equals(getString(appContext, R.string.client_token))) { merchant.fetchClientToken(appContext, (clientToken, error) -> { if (clientToken != null) { - callback.onSuccess(clientToken); + callback.onResult(clientToken); } else if (error != null) { - callback.onFailure(error); + callback.onResult(null); } }); } diff --git a/Demo/src/main/java/com/braintreepayments/demo/GooglePayFragment.java b/Demo/src/main/java/com/braintreepayments/demo/GooglePayFragment.java index e409eb1cf6..dff2f82c41 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/GooglePayFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/GooglePayFragment.java @@ -12,8 +12,6 @@ import androidx.navigation.NavDirections; import androidx.navigation.fragment.NavHostFragment; -import com.braintreepayments.api.BraintreeClient; -import com.braintreepayments.api.GooglePayCapabilities; import com.braintreepayments.api.GooglePayClient; import com.braintreepayments.api.GooglePayLauncher; import com.braintreepayments.api.GooglePayRequest; @@ -25,7 +23,6 @@ public class GooglePayFragment extends BaseFragment { private ImageButton googlePayButton; - private BraintreeClient braintreeClient; private GooglePayClient googlePayClient; private GooglePayLauncher googlePayLauncher; @@ -38,8 +35,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, googlePayButton = view.findViewById(R.id.google_pay_button); googlePayButton.setOnClickListener(this::launchGooglePay); - braintreeClient = getBraintreeClient(); - googlePayClient = new GooglePayClient(braintreeClient); + googlePayClient = new GooglePayClient(requireContext(), super.getAuthStringArg()); googlePayLauncher = new GooglePayLauncher(this, paymentAuthResult -> googlePayClient.tokenize(paymentAuthResult, (paymentMethodNonce, error) -> { @@ -57,27 +53,13 @@ public View onCreateView(@NonNull LayoutInflater inflater, public void onResume() { super.onResume(); - braintreeClient.getConfiguration((configuration, error) -> { - if (configuration == null) { - return; - } - - if (GooglePayCapabilities.isGooglePayEnabled(requireActivity(), configuration)) { - - googlePayClient.isReadyToPay(requireActivity(), (isReadyToPay, e) -> { - if (isReadyToPay) { - googlePayButton.setVisibility(View.VISIBLE); - } else { - showDialog( - "Google Payments are not available. The following issues could be the cause:\n\n" + - "No user is logged in to the device.\n\n" + - "Google Play Services is missing or out of date."); - } - }); + googlePayClient.isReadyToPay(requireActivity(), (isReadyToPay, e) -> { + if (isReadyToPay) { + googlePayButton.setVisibility(View.VISIBLE); } else { showDialog( "Google Payments are not available. The following issues could be the cause:\n\n" + - "Google Payments are not enabled for the current merchant.\n\n" + + "No user is logged in to the device.\n\n" + "Google Play Services is missing or out of date."); } }); diff --git a/Demo/src/main/java/com/braintreepayments/demo/LocalPaymentFragment.java b/Demo/src/main/java/com/braintreepayments/demo/LocalPaymentFragment.java index 1eb3399b69..19f14331da 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/LocalPaymentFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/LocalPaymentFragment.java @@ -10,7 +10,6 @@ import androidx.annotation.Nullable; import androidx.navigation.fragment.NavHostFragment; -import com.braintreepayments.api.BraintreeClient; import com.braintreepayments.api.LocalPaymentClient; import com.braintreepayments.api.LocalPaymentLauncher; import com.braintreepayments.api.LocalPaymentNonce; @@ -31,8 +30,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c Button mIdealButton = view.findViewById(R.id.ideal_button); mIdealButton.setOnClickListener(this::launchIdeal); - BraintreeClient braintreeClient = getBraintreeClient(); - localPaymentClient = new LocalPaymentClient(braintreeClient); + localPaymentClient = new LocalPaymentClient(requireContext(), super.getAuthStringArg()); localPaymentLauncher = new LocalPaymentLauncher( localPaymentResult -> localPaymentClient.tokenize(requireContext(), localPaymentResult, diff --git a/Demo/src/main/java/com/braintreepayments/demo/MainFragment.java b/Demo/src/main/java/com/braintreepayments/demo/MainFragment.java index 06dbcb1e67..45e6f4cbbc 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/MainFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/MainFragment.java @@ -15,8 +15,6 @@ public class MainFragment extends BaseFragment { - static final String EXTRA_PAYMENT_RESULT = "payment_result"; - static final String EXTRA_DEVICE_DATA = "device_data"; static final String EXTRA_COLLECT_DEVICE_DATA = "collect_device_data"; private static final String KEY_NONCE = "nonce"; @@ -71,59 +69,87 @@ public void onSaveInstanceState(Bundle outState) { } public void launchGooglePay(View v) { - NavDirections action = - MainFragmentDirections.actionMainFragmentToGooglePayFragment(); - Navigation.findNavController(v).navigate(action); + fetchAuthorization(authString -> { + NavDirections action = + MainFragmentDirections.actionMainFragmentToGooglePayFragment().setAuthString(authString); + Navigation.findNavController(v).navigate(action); + }); } public void launchCards(View v) { Bundle args = new Bundle(); args.putBoolean(EXTRA_COLLECT_DEVICE_DATA, Settings.shouldCollectDeviceData(getActivity())); - MainFragmentDirections.ActionMainFragmentToCardFragment action = - MainFragmentDirections.actionMainFragmentToCardFragment(); - action.setShouldCollectDeviceData(Settings.shouldCollectDeviceData(getActivity())); + fetchAuthorization(authString -> { + MainFragmentDirections.ActionMainFragmentToCardFragment action = + MainFragmentDirections.actionMainFragmentToCardFragment(); + action.setShouldCollectDeviceData(Settings.shouldCollectDeviceData(getActivity())); + action.setAuthString(authString); - Navigation.findNavController(v).navigate(action); + Navigation.findNavController(v).navigate(action); + }); } public void launchPayPal(View v) { - MainFragmentDirections.ActionMainFragmentToPayPalFragment action = - MainFragmentDirections.actionMainFragmentToPayPalFragment(); - action.setShouldCollectDeviceData(Settings.shouldCollectDeviceData(getActivity())); - - Navigation.findNavController(v).navigate(action); + fetchAuthorization(authString -> { + MainFragmentDirections.ActionMainFragmentToPayPalFragment action = + MainFragmentDirections.actionMainFragmentToPayPalFragment(); + action.setShouldCollectDeviceData(Settings.shouldCollectDeviceData(getActivity())); + action.setAuthString(authString); + + Navigation.findNavController(v).navigate(action); + }); } public void launchVenmo(View v) { - NavDirections action = MainFragmentDirections.actionMainFragmentToVenmoFragment(); - Navigation.findNavController(v).navigate(action); + fetchAuthorization(authString -> { + NavDirections action = MainFragmentDirections.actionMainFragmentToVenmoFragment() + .setAuthString(authString); + Navigation.findNavController(v).navigate(action); + }); } public void launchVisaCheckout(View v) { - NavDirections action = MainFragmentDirections.actionMainFragmentToVisaCheckoutFragment(); - Navigation.findNavController(v).navigate(action); + fetchAuthorization(authString -> { + NavDirections action = MainFragmentDirections.actionMainFragmentToVisaCheckoutFragment() + .setAuthString(authString); + Navigation.findNavController(v).navigate(action); + }); } public void launchLocalPayment(View v) { - NavDirections action = - MainFragmentDirections.actionMainFragmentToLocalPaymentFragment(); - Navigation.findNavController(v).navigate(action); + fetchAuthorization(authString -> { + NavDirections action = + MainFragmentDirections.actionMainFragmentToLocalPaymentFragment() + .setAuthString(authString); + Navigation.findNavController(v).navigate(action); + }); } public void launchSamsungPay(View v) { - NavDirections action = - MainFragmentDirections.actionMainFragmentToSamsungPayFragment(); - Navigation.findNavController(v).navigate(action); + fetchAuthorization(authString -> { + NavDirections action = + MainFragmentDirections.actionMainFragmentToSamsungPayFragment() + .setAuthString(authString); + Navigation.findNavController(v).navigate(action); + }); } public void launchPayPalNativeCheckout(View v) { - NavDirections action = MainFragmentDirections.actionMainFragmentToPayPalNativeCheckoutFragment(); - Navigation.findNavController(v).navigate(action); + fetchAuthorization(authString -> { + NavDirections action = + MainFragmentDirections.actionMainFragmentToPayPalNativeCheckoutFragment() + .setAuthString(authString); + Navigation.findNavController(v).navigate(action); + }); } public void launchSEPADirectDebit(View v) { - NavDirections action = MainFragmentDirections.actionMainFragmentToSepaDirectDebitFragment(); - Navigation.findNavController(v).navigate(action); + fetchAuthorization(authString -> { + NavDirections action = + MainFragmentDirections.actionMainFragmentToSepaDirectDebitFragment() + .setAuthString(authString); + Navigation.findNavController(v).navigate(action); + }); } } diff --git a/Demo/src/main/java/com/braintreepayments/demo/PayPalFragment.java b/Demo/src/main/java/com/braintreepayments/demo/PayPalFragment.java index 1eed3bb064..fe73e1b976 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/PayPalFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/PayPalFragment.java @@ -14,7 +14,6 @@ import androidx.fragment.app.FragmentActivity; import androidx.navigation.fragment.NavHostFragment; -import com.braintreepayments.api.BraintreeClient; import com.braintreepayments.api.DataCollector; import com.braintreepayments.api.PayPalClient; import com.braintreepayments.api.PayPalLauncher; @@ -26,7 +25,6 @@ public class PayPalFragment extends BaseFragment { private String deviceData; private String amount; - private BraintreeClient braintreeClient; private PayPalClient payPalClient; private PayPalLauncher payPalLauncher; @@ -43,8 +41,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c billingAgreementButton.setOnClickListener(this::launchBillingAgreement); singlePaymentButton.setOnClickListener(this::launchSinglePayment); - braintreeClient = getBraintreeClient(); - payPalClient = new PayPalClient(braintreeClient); + payPalClient = new PayPalClient(requireContext(), super.getAuthStringArg()); payPalLauncher = new PayPalLauncher( paymentAuthResult -> payPalClient.tokenize( paymentAuthResult, (payPalAccountNonce, error) -> { @@ -77,20 +74,18 @@ private void launchPayPal(boolean isBillingAgreement) { FragmentActivity activity = getActivity(); activity.setProgressBarIndeterminateVisibility(true); - dataCollector = new DataCollector(braintreeClient); + dataCollector = new DataCollector(requireContext(), super.getAuthStringArg()); - braintreeClient.getConfiguration((configuration, configError) -> { - if (Settings.shouldCollectDeviceData(requireActivity())) { - dataCollector.collectDeviceData(requireActivity(), (deviceDataResult, error) -> { - if (deviceDataResult != null) { - deviceData = deviceDataResult; - } - launchPayPal(activity, isBillingAgreement, amount); - }); - } else { + if (Settings.shouldCollectDeviceData(requireActivity())) { + dataCollector.collectDeviceData(requireActivity(), (deviceDataResult, error) -> { + if (deviceDataResult != null) { + deviceData = deviceDataResult; + } launchPayPal(activity, isBillingAgreement, amount); - } - }); + }); + } else { + launchPayPal(activity, isBillingAgreement, amount); + } } private void launchPayPal(FragmentActivity activity, boolean isBillingAgreement, diff --git a/Demo/src/main/java/com/braintreepayments/demo/PayPalNativeCheckoutFragment.java b/Demo/src/main/java/com/braintreepayments/demo/PayPalNativeCheckoutFragment.java index e1482245e6..bb53d4ade5 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/PayPalNativeCheckoutFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/PayPalNativeCheckoutFragment.java @@ -4,29 +4,26 @@ import static com.braintreepayments.demo.PayPalNativeCheckoutRequestFactory.createPayPalVaultRequest; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.fragment.app.FragmentActivity; -import androidx.navigation.fragment.NavHostFragment; - import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import com.braintreepayments.api.BraintreeClient; +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; +import androidx.navigation.fragment.NavHostFragment; + import com.braintreepayments.api.DataCollector; import com.braintreepayments.api.PayPalNativeCheckoutAccountNonce; -import com.braintreepayments.api.PayPalNativeCheckoutListener; import com.braintreepayments.api.PayPalNativeCheckoutClient; +import com.braintreepayments.api.PayPalNativeCheckoutListener; import com.braintreepayments.api.PaymentMethodNonce; public class PayPalNativeCheckoutFragment extends BaseFragment implements PayPalNativeCheckoutListener { private final String TAG = PayPalNativeCheckoutFragment.class.getName(); private String deviceData; - private BraintreeClient braintreeClient; private PayPalNativeCheckoutClient payPalClient; private DataCollector dataCollector; @@ -48,8 +45,7 @@ public View onCreateView( launchPayPalNativeCheckoutButton.setOnClickListener(v -> launchPayPalNativeCheckout(false)); launchPayPalNativeVaultCheckoutButton = view.findViewById(R.id.paypal_native_checkout_vault_launch); launchPayPalNativeVaultCheckoutButton.setOnClickListener(v -> launchPayPalNativeCheckout(true)); - braintreeClient = getBraintreeClient(); - payPalClient = new PayPalNativeCheckoutClient(this, braintreeClient); + payPalClient = new PayPalNativeCheckoutClient(requireContext(), super.getAuthStringArg()); payPalClient.setListener(this); return view; } @@ -58,25 +54,13 @@ private void launchPayPalNativeCheckout(boolean isBillingAgreement) { FragmentActivity activity = getActivity(); activity.setProgressBarIndeterminateVisibility(true); - dataCollector = new DataCollector(braintreeClient); + dataCollector = new DataCollector(requireContext(), super.getAuthStringArg()); - braintreeClient.getConfiguration((configuration, configError) -> { - if (Settings.shouldCollectDeviceData(requireActivity())) { - dataCollector.collectDeviceData(requireActivity(), (deviceDataResult, error) -> { - if (deviceDataResult != null) { - deviceData = deviceDataResult; - } - try { - if (isBillingAgreement) { - payPalClient.launchNativeCheckout(activity, createPayPalVaultRequest(activity)); - } else { - payPalClient.launchNativeCheckout(activity, createPayPalCheckoutRequest(activity, "1.00")); - } - } catch (Exception e) { - Log.i(TAG, "Unsupported type"); - } - }); - } else { + if (Settings.shouldCollectDeviceData(requireActivity())) { + dataCollector.collectDeviceData(requireActivity(), (deviceDataResult, error) -> { + if (deviceDataResult != null) { + deviceData = deviceDataResult; + } try { if (isBillingAgreement) { payPalClient.launchNativeCheckout(activity, createPayPalVaultRequest(activity)); @@ -86,9 +70,19 @@ private void launchPayPalNativeCheckout(boolean isBillingAgreement) { } catch (Exception e) { Log.i(TAG, "Unsupported type"); } - + }); + } else { + try { + if (isBillingAgreement) { + payPalClient.launchNativeCheckout(activity, createPayPalVaultRequest(activity)); + } else { + payPalClient.launchNativeCheckout(activity, createPayPalCheckoutRequest(activity, "1.00")); + } + } catch (Exception e) { + Log.i(TAG, "Unsupported type"); } - }); + + } } private void handlePayPalResult(PaymentMethodNonce paymentMethodNonce) { diff --git a/Demo/src/main/java/com/braintreepayments/demo/SEPADirectDebitFragment.java b/Demo/src/main/java/com/braintreepayments/demo/SEPADirectDebitFragment.java index f5932b4e9f..8d7ea10ec3 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/SEPADirectDebitFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/SEPADirectDebitFragment.java @@ -9,7 +9,6 @@ import androidx.annotation.NonNull; import androidx.navigation.fragment.NavHostFragment; -import com.braintreepayments.api.BraintreeClient; import com.braintreepayments.api.PostalAddress; import com.braintreepayments.api.SEPADirectDebitClient; import com.braintreepayments.api.SEPADirectDebitLauncher; @@ -30,8 +29,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Button button = view.findViewById(R.id.sepa_direct_debit_button); button.setOnClickListener(this::launchSEPADirectDebit); - BraintreeClient braintreeClient = getBraintreeClient(); - sepaDirectDebitClient = new SEPADirectDebitClient(braintreeClient); + sepaDirectDebitClient = new SEPADirectDebitClient(requireContext(), super.getAuthStringArg()); sepaDirectDebitLauncher = new SEPADirectDebitLauncher(sepaDirectDebitBrowserSwitchResult -> sepaDirectDebitClient.tokenize(sepaDirectDebitBrowserSwitchResult, (sepaDirectDebitNonce, error) -> { diff --git a/Demo/src/main/java/com/braintreepayments/demo/SamsungPayFragment.java b/Demo/src/main/java/com/braintreepayments/demo/SamsungPayFragment.java index 29b3ec4b6d..87d70da443 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/SamsungPayFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/SamsungPayFragment.java @@ -11,12 +11,11 @@ import androidx.navigation.NavDirections; import androidx.navigation.fragment.NavHostFragment; -import com.braintreepayments.api.BraintreeClient; import com.braintreepayments.api.SamsungPayClient; import com.braintreepayments.api.SamsungPayError; import com.braintreepayments.api.SamsungPayException; -import com.braintreepayments.api.SamsungPayNonce; import com.braintreepayments.api.SamsungPayListener; +import com.braintreepayments.api.SamsungPayNonce; import com.samsung.android.sdk.samsungpay.v2.SpaySdk; import com.samsung.android.sdk.samsungpay.v2.payment.CardInfo; import com.samsung.android.sdk.samsungpay.v2.payment.CustomSheetPaymentInfo; @@ -44,8 +43,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa @Override public void onResume() { super.onResume(); - BraintreeClient braintreeClient = getBraintreeClient(); - samsungPayClient = new SamsungPayClient(braintreeClient); + samsungPayClient = new SamsungPayClient(requireContext(), super.getAuthStringArg()); setupSamsungPayButton(); } diff --git a/Demo/src/main/java/com/braintreepayments/demo/VenmoFragment.java b/Demo/src/main/java/com/braintreepayments/demo/VenmoFragment.java index 076c0a5226..a96136581b 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/VenmoFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/VenmoFragment.java @@ -13,7 +13,6 @@ import androidx.navigation.NavDirections; import androidx.navigation.fragment.NavHostFragment; -import com.braintreepayments.api.BraintreeClient; import com.braintreepayments.api.UserCanceledException; import com.braintreepayments.api.VenmoAccountNonce; import com.braintreepayments.api.VenmoClient; @@ -21,8 +20,8 @@ import com.braintreepayments.api.VenmoLineItem; import com.braintreepayments.api.VenmoPaymentAuthRequest; import com.braintreepayments.api.VenmoPaymentMethodUsage; -import com.braintreepayments.api.VenmoResult; import com.braintreepayments.api.VenmoRequest; +import com.braintreepayments.api.VenmoResult; import java.util.ArrayList; @@ -31,7 +30,6 @@ public class VenmoFragment extends BaseFragment { private ImageButton venmoButton; private VenmoClient venmoClient; private VenmoLauncher venmoLauncher; - private BraintreeClient braintreeClient; @Nullable @Override @@ -66,8 +64,7 @@ private void handleVenmoAccountNonce(VenmoAccountNonce venmoAccountNonce) { public void launchVenmo(View v) { getActivity().setProgressBarIndeterminateVisibility(true); if (venmoClient == null) { - braintreeClient = getBraintreeClient(); - venmoClient = new VenmoClient(braintreeClient); + venmoClient = new VenmoClient(requireContext(), super.getAuthStringArg()); } FragmentActivity activity = getActivity(); @@ -75,34 +72,30 @@ public void launchVenmo(View v) { boolean shouldVault = Settings.vaultVenmo(activity) && !TextUtils.isEmpty(Settings.getCustomerId(activity)); - braintreeClient.getConfiguration((configuration, error) -> { - if (venmoClient.isVenmoAppSwitchAvailable(activity)) { - VenmoRequest venmoRequest = new VenmoRequest(VenmoPaymentMethodUsage.SINGLE_USE); - venmoRequest.setProfileId(null); - venmoRequest.setShouldVault(shouldVault); - venmoRequest.setCollectCustomerBillingAddress(true); - venmoRequest.setCollectCustomerShippingAddress(true); - venmoRequest.setTotalAmount("20"); - venmoRequest.setSubTotalAmount("18"); - venmoRequest.setTaxAmount("1"); - venmoRequest.setShippingAmount("1"); - ArrayList lineItems = new ArrayList<>(); - lineItems.add(new VenmoLineItem(VenmoLineItem.KIND_CREDIT, "Some Item", 1, "2")); - lineItems.add(new VenmoLineItem(VenmoLineItem.KIND_DEBIT, "Two Items", 2, "10")); - venmoRequest.setLineItems(lineItems); - - venmoClient.createPaymentAuthRequest(requireActivity(), venmoRequest, (paymentAuthRequest) -> { - if (paymentAuthRequest instanceof VenmoPaymentAuthRequest.Failure) { - handleError(((VenmoPaymentAuthRequest.Failure) paymentAuthRequest).getError()); - } else if (paymentAuthRequest instanceof VenmoPaymentAuthRequest.ReadyToLaunch) { - venmoLauncher.launch((VenmoPaymentAuthRequest.ReadyToLaunch) paymentAuthRequest); - } - }); - } else if (configuration.isVenmoEnabled()) { - showDialog("Please install the Venmo app first."); - } else { - showDialog("Venmo is not enabled for the current merchant."); - } - }); + if (venmoClient.isVenmoAppSwitchAvailable(activity)) { + VenmoRequest venmoRequest = new VenmoRequest(VenmoPaymentMethodUsage.SINGLE_USE); + venmoRequest.setProfileId(null); + venmoRequest.setShouldVault(shouldVault); + venmoRequest.setCollectCustomerBillingAddress(true); + venmoRequest.setCollectCustomerShippingAddress(true); + venmoRequest.setTotalAmount("20"); + venmoRequest.setSubTotalAmount("18"); + venmoRequest.setTaxAmount("1"); + venmoRequest.setShippingAmount("1"); + ArrayList lineItems = new ArrayList<>(); + lineItems.add(new VenmoLineItem(VenmoLineItem.KIND_CREDIT, "Some Item", 1, "2")); + lineItems.add(new VenmoLineItem(VenmoLineItem.KIND_DEBIT, "Two Items", 2, "10")); + venmoRequest.setLineItems(lineItems); + + venmoClient.createPaymentAuthRequest(requireActivity(), venmoRequest, (paymentAuthRequest) -> { + if (paymentAuthRequest instanceof VenmoPaymentAuthRequest.Failure) { + handleError(((VenmoPaymentAuthRequest.Failure) paymentAuthRequest).getError()); + } else if (paymentAuthRequest instanceof VenmoPaymentAuthRequest.ReadyToLaunch) { + venmoLauncher.launch((VenmoPaymentAuthRequest.ReadyToLaunch) paymentAuthRequest); + } + }); + } else { + showDialog("Please install the Venmo app first or confirm that Venmo is enabled for this merchant account"); + } } } diff --git a/Demo/src/main/java/com/braintreepayments/demo/VisaCheckoutFragment.java b/Demo/src/main/java/com/braintreepayments/demo/VisaCheckoutFragment.java index 29209c47c2..5f92a85836 100644 --- a/Demo/src/main/java/com/braintreepayments/demo/VisaCheckoutFragment.java +++ b/Demo/src/main/java/com/braintreepayments/demo/VisaCheckoutFragment.java @@ -9,7 +9,6 @@ import androidx.annotation.Nullable; import androidx.navigation.fragment.NavHostFragment; -import com.braintreepayments.api.BraintreeClient; import com.braintreepayments.api.PaymentMethodNonce; import com.braintreepayments.api.VisaCheckoutClient; import com.visa.checkout.CheckoutButton; @@ -31,8 +30,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c View view = inflater.inflate(R.layout.fragment_visa_checkout, container, false); checkoutButton = view.findViewById(R.id.visa_checkout_button); - BraintreeClient braintreeClient = getBraintreeClient(); - visaCheckoutClient = new VisaCheckoutClient(braintreeClient); + visaCheckoutClient = new VisaCheckoutClient(requireContext(), super.getAuthStringArg()); visaCheckoutClient.createProfileBuilder((profileBuilder, error) -> { if (profileBuilder != null) { setupVisaCheckoutButton(profileBuilder); diff --git a/Demo/src/main/res/navigation/nav_graph.xml b/Demo/src/main/res/navigation/nav_graph.xml index 91c791b841..119b91362e 100644 --- a/Demo/src/main/res/navigation/nav_graph.xml +++ b/Demo/src/main/res/navigation/nav_graph.xml @@ -46,6 +46,10 @@ android:name="shouldCollectDeviceData" android:defaultValue="false" app:argType="boolean" /> + + + + + + + + + - * Create a new instance of {@link PayPalNativeCheckoutClient} from within a Fragment using a - * {@link BraintreeClient}. + * Initializes a new {@link PayPalNativeCheckoutClient} instance + * + * @param context an Android Context + * @param authorization a Tokenization Key or Client Token used to authenticate */ - @Deprecated - public PayPalNativeCheckoutClient(@NonNull Fragment fragment, - @NonNull BraintreeClient braintreeClient) { - this(braintreeClient, new PayPalNativeCheckoutInternalClient(braintreeClient)); + public PayPalNativeCheckoutClient(@NonNull Context context, @NonNull String authorization) { + this(new BraintreeClient(context, authorization)); } - /** - * Create a new instance of {@link PayPalNativeCheckoutClient} using a {@link BraintreeClient}. - * - * @param braintreeClient a {@link BraintreeClient} - */ - public PayPalNativeCheckoutClient(@NonNull BraintreeClient braintreeClient) { + @VisibleForTesting + PayPalNativeCheckoutClient(@NonNull BraintreeClient braintreeClient) { this(braintreeClient, new PayPalNativeCheckoutInternalClient(braintreeClient)); } diff --git a/SEPADirectDebit/src/main/java/com/braintreepayments/api/SEPADirectDebitClient.java b/SEPADirectDebit/src/main/java/com/braintreepayments/api/SEPADirectDebitClient.java index b250ef072b..cea89aeb59 100644 --- a/SEPADirectDebit/src/main/java/com/braintreepayments/api/SEPADirectDebitClient.java +++ b/SEPADirectDebit/src/main/java/com/braintreepayments/api/SEPADirectDebitClient.java @@ -26,11 +26,17 @@ public class SEPADirectDebitClient { private final BraintreeClient braintreeClient; /** - * Create a new instance of {@link SEPADirectDebitClient} using a {@link BraintreeClient}. + * Initializes a new {@link SEPADirectDebitClient} instance * - * @param braintreeClient a {@link BraintreeClient} + * @param context an Android Context + * @param authorization a Tokenization Key or Client Token used to authenticate */ - public SEPADirectDebitClient(@NonNull BraintreeClient braintreeClient) { + public SEPADirectDebitClient(@NonNull Context context, @NonNull String authorization) { + this(new BraintreeClient(context, authorization)); + } + + @VisibleForTesting + SEPADirectDebitClient(@NonNull BraintreeClient braintreeClient) { this(braintreeClient, new SEPADirectDebitApi(braintreeClient)); } diff --git a/SamsungPay/src/main/java/com/braintreepayments/api/SamsungPayClient.java b/SamsungPay/src/main/java/com/braintreepayments/api/SamsungPayClient.java index 1b4e49c870..3861c881fd 100644 --- a/SamsungPay/src/main/java/com/braintreepayments/api/SamsungPayClient.java +++ b/SamsungPay/src/main/java/com/braintreepayments/api/SamsungPayClient.java @@ -1,5 +1,6 @@ package com.braintreepayments.api; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -17,6 +18,8 @@ import static com.samsung.android.sdk.samsungpay.v2.SpaySdk.SPAY_NOT_SUPPORTED; import static com.samsung.android.sdk.samsungpay.v2.SpaySdk.SPAY_READY; +import android.content.Context; + public class SamsungPayClient { private final BraintreeClient braintreeClient; @@ -24,7 +27,18 @@ public class SamsungPayClient { @VisibleForTesting SamsungPayInternalClient internalClient; - public SamsungPayClient(BraintreeClient braintreeClient) { + /** + * Initializes a new {@link SamsungPayClient} instance + * + * @param context an Android Context + * @param authorization a Tokenization Key or Client Token used to authenticate + */ + public SamsungPayClient(@NonNull Context context, @NonNull String authorization) { + this(new BraintreeClient(context, authorization)); + } + + @VisibleForTesting + SamsungPayClient(BraintreeClient braintreeClient) { this.braintreeClient = braintreeClient; } diff --git a/ThreeDSecure/src/main/java/com/braintreepayments/api/ThreeDSecureClient.java b/ThreeDSecure/src/main/java/com/braintreepayments/api/ThreeDSecureClient.java index bd77f74baf..773d55ce94 100644 --- a/ThreeDSecure/src/main/java/com/braintreepayments/api/ThreeDSecureClient.java +++ b/ThreeDSecure/src/main/java/com/braintreepayments/api/ThreeDSecureClient.java @@ -10,6 +10,7 @@ import org.json.JSONException; import org.json.JSONObject; + /** * 3D Secure is a protocol that enables cardholders and issuers to add a layer of security to * e-commerce transactions via password entry at checkout. @@ -26,11 +27,17 @@ public class ThreeDSecureClient { private final ThreeDSecureAPI api; /** - * Create a new instance of {@link ThreeDSecureClient} using a {@link BraintreeClient}. + * Initializes a new {@link ThreeDSecureClient} instance * - * @param braintreeClient a {@link BraintreeClient} + * @param context an Android Context + * @param authorization a Tokenization Key or Client Token used to authenticate */ - public ThreeDSecureClient(@NonNull BraintreeClient braintreeClient) { + public ThreeDSecureClient(@NonNull Context context, @NonNull String authorization) { + this(new BraintreeClient(context, authorization)); + } + + @VisibleForTesting + ThreeDSecureClient(@NonNull BraintreeClient braintreeClient) { this(braintreeClient, new CardinalClient(), new ThreeDSecureAPI(braintreeClient)); } diff --git a/Venmo/src/main/java/com/braintreepayments/api/VenmoClient.java b/Venmo/src/main/java/com/braintreepayments/api/VenmoClient.java index 09fdbd6fd2..a69e978948 100644 --- a/Venmo/src/main/java/com/braintreepayments/api/VenmoClient.java +++ b/Venmo/src/main/java/com/braintreepayments/api/VenmoClient.java @@ -28,11 +28,17 @@ private VenmoClient(BraintreeClient braintreeClient, ApiClient apiClient) { } /** - * Create a new instance of {@link VenmoClient} using a {@link BraintreeClient}. + * Initializes a new {@link VenmoClient} instance * - * @param braintreeClient a {@link BraintreeClient} + * @param context an Android Context + * @param authorization a Tokenization Key or Client Token used to authenticate */ - public VenmoClient(@NonNull BraintreeClient braintreeClient) { + public VenmoClient(@NonNull Context context, @NonNull String authorization) { + this(new BraintreeClient(context, authorization)); + } + + @VisibleForTesting + VenmoClient(@NonNull BraintreeClient braintreeClient) { this(braintreeClient, new ApiClient(braintreeClient)); } diff --git a/VisaCheckout/src/main/java/com/braintreepayments/api/VisaCheckoutClient.java b/VisaCheckout/src/main/java/com/braintreepayments/api/VisaCheckoutClient.java index f46b8aea4e..8483ceded8 100644 --- a/VisaCheckout/src/main/java/com/braintreepayments/api/VisaCheckoutClient.java +++ b/VisaCheckout/src/main/java/com/braintreepayments/api/VisaCheckoutClient.java @@ -1,5 +1,7 @@ package com.braintreepayments.api; +import android.content.Context; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -22,7 +24,18 @@ public class VisaCheckoutClient { private final BraintreeClient braintreeClient; private final ApiClient apiClient; - public VisaCheckoutClient(@NonNull BraintreeClient braintreeClient) { + /** + * Initializes a new {@link VisaCheckoutClient} instance + * + * @param context an Android Context + * @param authorization a Tokenization Key or Client Token used to authenticate + */ + public VisaCheckoutClient(@NonNull Context context, @NonNull String authorization) { + this(new BraintreeClient(context, authorization)); + } + + @VisibleForTesting + VisaCheckoutClient(@NonNull BraintreeClient braintreeClient) { this(braintreeClient, new ApiClient(braintreeClient)); } diff --git a/v5_MIGRATION_GUIDE.md b/v5_MIGRATION_GUIDE.md index 60d8a9d8d3..1d65fdcf66 100644 --- a/v5_MIGRATION_GUIDE.md +++ b/v5_MIGRATION_GUIDE.md @@ -6,6 +6,7 @@ basics for updating your Braintree integration from v4 to v5. ## Table of Contents 1. [Android API](#android-api) +1. [Braintree Client](#braintree-client) 1. [Data Collector](#data-collector) 1. [Union Pay](#union-pay) 1. [Venmo](#venmo) @@ -19,6 +20,16 @@ basics for updating your Braintree integration from v4 to v5. The minimum supported Android API level for v5 of this SDK has increased to 23. +## Braintree Client + +You no longer need to instantiate a `BraintreeClient` in order to instantiate the payment method +clients. Instead, construct the payment method clients with `context` and `authorization` +parameters directly. + +```kotlin +val cardClient = CardClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") +``` + ## Data Collector The `paypal-data-collector` module has been removed and replaced by the `data-collector` module. @@ -31,7 +42,7 @@ merchantId, callback)` is now `DataCollector#collectDeviceData(context, riskCorr callback)`, where `riskCorrelationId` is an optional client metadata ID. ```kotlin -val dataCollector = DataCollector(braintreeClient) +val dataCollector = DataCollector(context, authorization) dataCollector.collectDeviceData(context) { deviceData, error -> // send deviceData to your server } @@ -63,7 +74,7 @@ need to be instantiated in `OnCreate`. class MyActivity : FragmentActivity() { + private lateinit var venmoLauncher: VenmoLauncher - private lateinit var braintreeClient: BraintreeClient +- private lateinit var braintreeClient: BraintreeClient private lateinit var venmoClient: VenmoClient override fun onCreate(savedInstanceState: Bundle?) { @@ -81,9 +92,9 @@ class MyActivity : FragmentActivity() { } fun initializeClients() { - braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") +- braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - venmoClient = VenmoClient(this, braintreeClient) -+ venmoClient = VenmoClient(braintreeClient) ++ venmoClient = VenmoClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - venmoClient.setListener(this) } @@ -126,7 +137,7 @@ do not need to be instantiated in `OnCreate`. class MyActivity : FragmentActivity() { + private lateinit var googlePayLauncher: GooglePayLauncher - private lateinit var braintreeClient: BraintreeClient +- private lateinit var braintreeClient: BraintreeClient private lateinit var googlePayClient: GooglePayClient override fun onCreate(savedInstanceState: Bundle?) { @@ -141,9 +152,9 @@ class MyActivity : FragmentActivity() { } fun initializeClients() { - braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") +- braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - goolePayClient = GooglePayClient(this, braintreeClient) -+ googlePayClient = GooglePayClient(braintreeClient) ++ googlePayClient = GooglePayClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - googlePayClient.setListener(this) } @@ -184,7 +195,7 @@ and `ThreeDSecureV1UICustomization` has been removed. class MyActivity : FragmentActivity() { + private lateinit var threeDSecureLauncher: ThreeDSecureLauncher - private lateinit var braintreeClient: BraintreeClient +- private lateinit var braintreeClient: BraintreeClient private lateinit var threeDSecureClient: VenmoClient override fun onCreate(savedInstanceState: Bundle?) { @@ -199,9 +210,9 @@ class MyActivity : FragmentActivity() { } fun initializeClients() { - braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") +- braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - threeDSecureClient = ThreeDSecureClient(this, braintreeClient) -+ threeDSecureClient = ThreeDSeucreClient(braintreeClient) ++ threeDSecureClient = ThreeDSecureClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - threeDSecureClient.setListener(this) } @@ -246,7 +257,7 @@ do not need to be instantiated in `OnCreate`. class MyActivity : FragmentActivity() { + private lateinit var payPalLauncher: payPalLauncher - private lateinit var braintreeClient: BraintreeClient +- private lateinit var braintreeClient: BraintreeClient private lateinit var payPalClient: PayPalClient override fun onCreate(savedInstanceState: Bundle?) { @@ -272,9 +283,9 @@ class MyActivity : FragmentActivity() { fun initializeClients() { - braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") +- braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - payPalClient = PayPalClient(this, braintreeClient) -+ payPalClient = PayPalClient(braintreeClient) ++ payPalClient = PayPalClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - payPalClient.setListener(this) } @@ -315,7 +326,7 @@ do not need to be instantiated in `OnCreate`. class MyActivity : FragmentActivity() { + private lateinit var localPaymentLauncher: localPaymentLauncher - private lateinit var braintreeClient: BraintreeClient +- private lateinit var braintreeClient: BraintreeClient private lateinit var localPaymentClient: LocalPaymentClient @override fun onCreate(savedInstanceState: Bundle?) { @@ -342,9 +353,9 @@ class MyActivity : FragmentActivity() { fun initializeClients() { - braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") +- braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - localPaymentClient = LocalPaymentClient(this, braintreeClient) -+ localPaymentClient = LocalPaymentClient(braintreeClient) ++ localPaymentClient = LocalPaymentClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - localPaymentClient.setListener(this) } @@ -384,7 +395,7 @@ do not need to be instantiated in `OnCreate`. class MyActivity : FragmentActivity() { + private lateinit var sepaDirectDebitLauncher: SEPADirectDebitLAuncher - private lateinit var braintreeClient: BraintreeClient +- private lateinit var braintreeClient: BraintreeClient private lateinit var sepaDirectDebitClient: SEPADirectDebitClient override fun onCreate(savedInstanceState: Bundle?) { @@ -410,9 +421,9 @@ class MyActivity : FragmentActivity() { } fun initializeClients() { - braintreClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") +- braintreeClient = BraintreeClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - sepaDirectDebitClient = SEPADirectDebitClient(this, braintreeClient) -+ sepaDirectDebitClient = SEPADirectDebitClient(braintreeClient) ++ sepaDirectDebitClient = sepaDirectDebitClient(context, "TOKENIZATION_KEY_OR_CLIENT_TOKEN") - sepaDirectDebitClient.setListener(this) }