Skip to content

Commit

Permalink
VenmoListener NPE Fix (#848)
Browse files Browse the repository at this point in the history
* Check for listener before returning result

* Add unit test

* Add CHANGELOG

* Fix spacing

* Log warning if listener is null

* Move logging to utils class

* Update tag name

* Fix lint
  • Loading branch information
sarahkoop authored Dec 11, 2023
1 parent ed09dab commit 2dbc07c
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 10 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Braintree Android SDK Release Notes

## unreleased

* Venmo
* Fix NPE when `VenmoListener` is null (fixes #832)

## 4.40.0 (2023-11-16)

* PayPalNativeCheckout
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.braintreepayments.api

import androidx.annotation.RestrictTo

/**
* @suppress
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
object LoggingUtils {

const val TAG = "Braintree SDK"

const val LISTENER_WARNING = "Unable to deliver result to null listener"
}
37 changes: 27 additions & 10 deletions Venmo/src/main/java/com/braintreepayments/api/VenmoClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import android.content.Intent;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
Expand Down Expand Up @@ -132,7 +133,7 @@ public void tokenizeVenmoAccount(@NonNull final FragmentActivity activity, @NonN
@Override
public void onResult(@Nullable Exception error) {
if (error != null) {
listener.onVenmoFailure(error);
deliverVenmoFailure(error);
}
}
});
Expand Down Expand Up @@ -254,19 +255,19 @@ public void onResult(@Nullable VenmoAccountNonce nonce, @Nullable Exception erro
@Override
public void onResult(@Nullable VenmoAccountNonce venmoAccountNonce, @Nullable Exception error) {
if (venmoAccountNonce != null) {
listener.onVenmoSuccess(venmoAccountNonce);
deliverVenmoSuccess(venmoAccountNonce);
} else if (error != null) {
listener.onVenmoFailure(error);
deliverVenmoFailure(error);
}
}
});
} else {
braintreeClient.sendAnalyticsEvent("pay-with-venmo.app-switch.failure");
listener.onVenmoSuccess(nonce);
deliverVenmoSuccess(nonce);
}
} else {
braintreeClient.sendAnalyticsEvent("pay-with-venmo.app-switch.failure");
listener.onVenmoFailure(error);
deliverVenmoFailure(error);
}
}
});
Expand All @@ -279,21 +280,21 @@ public void onResult(@Nullable VenmoAccountNonce venmoAccountNonce, @Nullable Ex
@Override
public void onResult(@Nullable VenmoAccountNonce venmoAccountNonce, @Nullable Exception error) {
if (venmoAccountNonce != null) {
listener.onVenmoSuccess(venmoAccountNonce);
deliverVenmoSuccess(venmoAccountNonce);
} else if (error != null) {
listener.onVenmoFailure(error);
deliverVenmoFailure(error);
}
}
});
} else {
String venmoUsername = venmoResult.getVenmoUsername();
VenmoAccountNonce venmoAccountNonce = new VenmoAccountNonce(nonce, venmoUsername, false);
listener.onVenmoSuccess(venmoAccountNonce);
deliverVenmoSuccess(venmoAccountNonce);
}

}
} else if (authError != null) {
listener.onVenmoFailure(authError);
deliverVenmoFailure(authError);
}
}
});
Expand All @@ -302,7 +303,23 @@ public void onResult(@Nullable VenmoAccountNonce venmoAccountNonce, @Nullable Ex
if (venmoResult.getError() instanceof UserCanceledException) {
braintreeClient.sendAnalyticsEvent("pay-with-venmo.app-switch.canceled");
}
listener.onVenmoFailure(venmoResult.getError());
deliverVenmoFailure(venmoResult.getError());
}
}

private void deliverVenmoSuccess(VenmoAccountNonce venmoAccountNonce) {
if (listener != null) {
listener.onVenmoSuccess(venmoAccountNonce);
} else {
Log.w(LoggingUtils.TAG, LoggingUtils.LISTENER_WARNING);
}
}

private void deliverVenmoFailure(Exception error) {
if (listener != null) {
listener.onVenmoFailure(error);
} else {
Log.w(LoggingUtils.TAG, LoggingUtils.LISTENER_WARNING);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,31 @@ public void showVenmoInGooglePlayStore_sendsAnalyticsEvent() {
verify(braintreeClient).sendAnalyticsEvent("android.pay-with-venmo.app-store.invoked");
}

@Test
public void tokenizeVenmoAccount_whenListenerNull_returnsNothing() {
BraintreeClient braintreeClient = new MockBraintreeClientBuilder()
.configuration(venmoEnabledConfiguration)
.sessionId("session-id")
.integration("custom")
.authorizationSuccess(clientToken)
.build();

VenmoApi venmoApi = new MockVenmoApiBuilder()
.createPaymentContextSuccess("venmo-payment-context-id")
.build();

when(deviceInspector.isVenmoAppSwitchAvailable(activity)).thenReturn(true);

VenmoRequest request = new VenmoRequest(VenmoPaymentMethodUsage.SINGLE_USE);
request.setProfileId("sample-venmo-merchant");
request.setCollectCustomerBillingAddress(true);

VenmoClient sut = new VenmoClient(null, null, braintreeClient, venmoApi, sharedPrefsWriter, deviceInspector);
sut.tokenizeVenmoAccount(activity, request);
verify(listener, never()).onVenmoFailure(any(Exception.class));
verify(listener, never()).onVenmoSuccess(any(VenmoAccountNonce.class));
}

@Test
public void tokenizeVenmoAccount_whenCreatePaymentContextSucceeds_withObserver_launchesObserverWithVenmoIntentData_andSendsAnalytics() {
BraintreeClient braintreeClient = new MockBraintreeClientBuilder()
Expand Down

0 comments on commit 2dbc07c

Please sign in to comment.