Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use strong references to callbacks in Stripe and CustomerSession #863

Merged
merged 1 commit into from Apr 11, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
41 changes: 17 additions & 24 deletions stripe/src/main/java/com/stripe/android/CustomerSession.java
Expand Up @@ -17,8 +17,6 @@
import com.stripe.android.model.ShippingInformation;
import com.stripe.android.model.Source;

import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
Expand Down Expand Up @@ -79,10 +77,10 @@ public class CustomerSession
@Nullable private Customer mCustomer;
private long mCustomerCacheTime;
@Nullable private Context mContext;
@NonNull private final Map<String, WeakReference<CustomerRetrievalListener>>
mCustomerRetrievalListenerRefs = new HashMap<>();
@NonNull private final Map<String, WeakReference<SourceRetrievalListener>>
mSourceRetrievalListenerRefs = new HashMap<>();
@NonNull private final Map<String, CustomerRetrievalListener> mCustomerRetrievalListeners =
new HashMap<>();
@NonNull private final Map<String, SourceRetrievalListener> mSourceRetrievalListeners =
new HashMap<>();

@NonNull private final EphemeralKeyManager mEphemeralKeyManager;
@NonNull private final Handler mUiThreadHandler;
Expand Down Expand Up @@ -134,8 +132,8 @@ public static void endCustomerSession() {
@VisibleForTesting
static void clearInstance() {
if (mInstance != null) {
mInstance.mCustomerRetrievalListenerRefs.clear();
mInstance.mSourceRetrievalListenerRefs.clear();
mInstance.mCustomerRetrievalListeners.clear();
mInstance.mSourceRetrievalListeners.clear();
}
cancelCallbacks();
setInstance(null);
Expand Down Expand Up @@ -202,7 +200,7 @@ public void retrieveCurrentCustomer(@NonNull CustomerRetrievalListener listener)
mCustomer = null;

final String operationId = UUID.randomUUID().toString();
mCustomerRetrievalListenerRefs.put(operationId, new WeakReference<>(listener));
mCustomerRetrievalListeners.put(operationId, listener);
mEphemeralKeyManager.retrieveEphemeralKey(operationId, null, null);
}
}
Expand All @@ -217,7 +215,7 @@ public void updateCurrentCustomer(@NonNull CustomerRetrievalListener listener) {
mCustomer = null;

final String operationId = UUID.randomUUID().toString();
mCustomerRetrievalListenerRefs.put(operationId, new WeakReference<>(listener));
mCustomerRetrievalListeners.put(operationId, listener);
mEphemeralKeyManager.retrieveEphemeralKey(operationId, null, null);
}

Expand Down Expand Up @@ -256,7 +254,7 @@ public void addCustomerSource(

final String operationId = UUID.randomUUID().toString();
if (listener != null) {
mSourceRetrievalListenerRefs.put(operationId, new WeakReference<>(listener));
mSourceRetrievalListeners.put(operationId, listener);
}
mEphemeralKeyManager.retrieveEphemeralKey(operationId, ACTION_ADD_SOURCE, arguments);
}
Expand All @@ -278,7 +276,7 @@ public void deleteCustomerSource(

final String operationId = UUID.randomUUID().toString();
if (listener != null) {
mSourceRetrievalListenerRefs.put(operationId, new WeakReference<>(listener));
mSourceRetrievalListeners.put(operationId, listener);
}
mEphemeralKeyManager.retrieveEphemeralKey(operationId, ACTION_DELETE_SOURCE, arguments);
}
Expand Down Expand Up @@ -319,7 +317,7 @@ public void setCustomerDefaultSource(

final String operationId = UUID.randomUUID().toString();
if (listener != null) {
mCustomerRetrievalListenerRefs.put(operationId, new WeakReference<>(listener));
mCustomerRetrievalListeners.put(operationId, listener);
}
mEphemeralKeyManager.retrieveEphemeralKey(operationId, ACTION_SET_DEFAULT_SOURCE,
arguments);
Expand Down Expand Up @@ -629,16 +627,15 @@ public void handleMessage(@NonNull Message msg) {
private void handleRetrievalError(@Nullable String operationId,
@NonNull StripeException exception,
int errorType) {
final WeakReference<? extends RetrievalListener> listenerRef;
final RetrievalListener listener;
if (errorType == SOURCE_ERROR) {
listenerRef = mSourceRetrievalListenerRefs.remove(operationId);
listener = mSourceRetrievalListeners.remove(operationId);
} else if (errorType == CUSTOMER_ERROR) {
listenerRef = mCustomerRetrievalListenerRefs.remove(operationId);
listener = mCustomerRetrievalListeners.remove(operationId);
} else {
listenerRef = null;
listener = null;
}

final RetrievalListener listener = listenerRef != null ? listenerRef.get() : null;
if (listener != null) {
final int errorCode = exception.getStatusCode() == null
? 400
Expand Down Expand Up @@ -758,16 +755,12 @@ private void sendErrorIntent(@NonNull StripeException exception) {

@Nullable
private CustomerRetrievalListener getCustomerRetrievalListener(@Nullable String operationId) {
final Reference<CustomerRetrievalListener> listenerRef =
mCustomerRetrievalListenerRefs.remove(operationId);
return listenerRef != null ? listenerRef.get() : null;
return mCustomerRetrievalListeners.remove(operationId);
}

@Nullable
private SourceRetrievalListener getSourceRetrievalListener(@Nullable String operationId) {
final Reference<SourceRetrievalListener> listenerRef =
mSourceRetrievalListenerRefs.remove(operationId);
return listenerRef != null ? listenerRef.get() : null;
return mSourceRetrievalListeners.remove(operationId);
}

public interface CustomerRetrievalListener extends RetrievalListener {
Expand Down
38 changes: 16 additions & 22 deletions stripe/src/main/java/com/stripe/android/Stripe.java
Expand Up @@ -947,7 +947,7 @@ private static class CreateSourceTask extends AsyncTask<Void, Void, ResponseWrap
@NonNull private final SourceParams mSourceParams;
@NonNull private final String mPublishableKey;
@Nullable private final String mStripeAccount;
@NonNull private final WeakReference<SourceCallback> mSourceCallbackRef;
@NonNull private final SourceCallback mSourceCallback;

CreateSourceTask(@NonNull Context context,
@NonNull StripeApiHandler apiHandler,
Expand All @@ -960,7 +960,7 @@ private static class CreateSourceTask extends AsyncTask<Void, Void, ResponseWrap
mSourceParams = sourceParams;
mPublishableKey = publishableKey;
mStripeAccount = stripeAccount;
mSourceCallbackRef = new WeakReference<>(sourceCallback);
mSourceCallback = sourceCallback;
}

@Override
Expand All @@ -981,13 +981,10 @@ protected ResponseWrapper doInBackground(Void... params) {

@Override
protected void onPostExecute(@NonNull ResponseWrapper responseWrapper) {
final SourceCallback sourceCallback = mSourceCallbackRef.get();
if (sourceCallback != null) {
if (responseWrapper.source != null) {
sourceCallback.onSuccess(responseWrapper.source);
} else if (responseWrapper.error != null) {
sourceCallback.onError(responseWrapper.error);
}
if (responseWrapper.source != null) {
mSourceCallback.onSuccess(responseWrapper.source);
} else if (responseWrapper.error != null) {
mSourceCallback.onError(responseWrapper.error);
}
}
}
Expand All @@ -999,7 +996,7 @@ private static class CreateTokenTask extends AsyncTask<Void, Void, ResponseWrapp
@NonNull private final String mPublishableKey;
@Nullable private final String mStripeAccount;
@NonNull @Token.TokenType private final String mTokenType;
@NonNull private final WeakReference<TokenCallback> mCallbackRef;
@NonNull private final TokenCallback mCallback;
@Nullable private final StripeApiHandler.LoggingResponseListener mLoggingResponseListener;

CreateTokenTask(@NonNull Context context,
Expand All @@ -1008,7 +1005,7 @@ private static class CreateTokenTask extends AsyncTask<Void, Void, ResponseWrapp
@NonNull final String publishableKey,
@Nullable final String stripeAccount,
@NonNull @Token.TokenType final String tokenType,
@Nullable final TokenCallback callback,
@NonNull final TokenCallback callback,
@Nullable final StripeApiHandler.LoggingResponseListener loggingResponseListener) {
mContextRef = new WeakReference<>(context);
mApiHandler = apiHandler;
Expand All @@ -1017,7 +1014,7 @@ private static class CreateTokenTask extends AsyncTask<Void, Void, ResponseWrapp
mStripeAccount = stripeAccount;
mTokenType = tokenType;
mLoggingResponseListener = loggingResponseListener;
mCallbackRef = new WeakReference<>(callback);
mCallback = callback;
}

@Override
Expand All @@ -1043,16 +1040,13 @@ protected void onPostExecute(@NonNull ResponseWrapper result) {
}

private void tokenTaskPostExecution(@NonNull ResponseWrapper result) {
final TokenCallback callback = mCallbackRef.get();
if (callback != null) {
if (result.token != null) {
callback.onSuccess(result.token);
} else if (result.error != null) {
callback.onError(result.error);
} else {
callback.onError(new RuntimeException("Somehow got neither a token response or"
+ " an error response"));
}
if (result.token != null) {
mCallback.onSuccess(result.token);
} else if (result.error != null) {
mCallback.onError(result.error);
} else {
mCallback.onError(new RuntimeException(
"Somehow got neither a token response or an error response"));
}
}
}
Expand Down