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

Issue #252 - BraintreeFragment with child FragmentManager. #253

Merged
merged 1 commit into from
Jun 5, 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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import com.braintreepayments.api.exceptions.BraintreeException;
Expand Down Expand Up @@ -135,8 +136,39 @@ public static BraintreeFragment newInstance(AppCompatActivity activity, String a
throw new InvalidArgumentException("Activity is null");
}

FragmentManager fm = activity.getSupportFragmentManager();
BraintreeFragment braintreeFragment = (BraintreeFragment) fm.findFragmentByTag(TAG);
return newInstance(activity, activity.getSupportFragmentManager(), authorization);
}

/**
* Create a new instance of {@link BraintreeFragment} using the client token and add it to the
* {@link Fragment}'s child {@link FragmentManager}.
*
* @param fragment The {@link Fragment} to add the {@link BraintreeFragment} to.
* @param authorization The tokenization key or client token to use.
* @return {@link BraintreeFragment}
* @throws InvalidArgumentException If the tokenization key or client token is not valid or cannot be
* parsed.
*/
public static BraintreeFragment newInstance(Fragment fragment, String authorization)
throws InvalidArgumentException {
if (fragment == null) {
throw new InvalidArgumentException("Fragment is null");
}

return newInstance(fragment.getContext(), fragment.getChildFragmentManager(), authorization);
}

private static BraintreeFragment newInstance(Context context, FragmentManager fragmentManager, String authorization)
throws InvalidArgumentException {
if (context == null) {
throw new InvalidArgumentException("Context is null");
}

if (fragmentManager == null) {
throw new InvalidArgumentException("FragmentManager is null");
}

BraintreeFragment braintreeFragment = (BraintreeFragment) fragmentManager.findFragmentByTag(TAG);
if (braintreeFragment == null) {
braintreeFragment = new BraintreeFragment();
Bundle bundle = new Bundle();
Expand All @@ -149,31 +181,31 @@ public static BraintreeFragment newInstance(AppCompatActivity activity, String a
}

bundle.putString(EXTRA_SESSION_ID, UUIDHelper.getFormattedUUID());
bundle.putString(EXTRA_INTEGRATION_TYPE, IntegrationType.get(activity));
bundle.putString(EXTRA_INTEGRATION_TYPE, IntegrationType.get(context));
braintreeFragment.setArguments(bundle);

try {
if (VERSION.SDK_INT >= VERSION_CODES.N) {
try {
fm.beginTransaction().add(braintreeFragment, TAG).commitNow();
fragmentManager.beginTransaction().add(braintreeFragment, TAG).commitNow();
} catch (IllegalStateException | NullPointerException e) {
fm.beginTransaction().add(braintreeFragment, TAG).commit();
fragmentManager.beginTransaction().add(braintreeFragment, TAG).commit();
try {
fm.executePendingTransactions();
fragmentManager.executePendingTransactions();
} catch (IllegalStateException ignored) {}
}
} else {
fm.beginTransaction().add(braintreeFragment, TAG).commit();
fragmentManager.beginTransaction().add(braintreeFragment, TAG).commit();
try {
fm.executePendingTransactions();
fragmentManager.executePendingTransactions();
} catch (IllegalStateException ignored) {}
}
} catch (IllegalStateException e) {
throw new InvalidArgumentException(e.getMessage());
}
}

braintreeFragment.mContext = activity.getApplicationContext();
braintreeFragment.mContext = context.getApplicationContext();

return braintreeFragment;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package com.braintreepayments.api.internal;

import android.app.Activity;
import android.content.Context;

public class IntegrationType {

public static String get(Activity activity) {
public static String get(Context context) {
try {
if (Class.forName("com.braintreepayments.api.BraintreePaymentActivity").isInstance(activity)) {
if (Class.forName("com.braintreepayments.api.BraintreePaymentActivity").isInstance(context)) {
return "dropin";
}
} catch (ClassNotFoundException ignored) {}

try {
if (Class.forName("com.braintreepayments.api.dropin.DropInActivity").isInstance(activity)) {
if (Class.forName("com.braintreepayments.api.dropin.DropInActivity").isInstance(context)) {
return "dropin2";
}
} catch (ClassNotFoundException ignored) {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import java.util.concurrent.atomic.AtomicInteger;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;

import static com.braintreepayments.api.internal.AnalyticsDatabaseTestUtils.verifyAnalyticsEvent;
import static com.braintreepayments.testutils.FixturesHelper.stringFromFixture;
Expand Down Expand Up @@ -141,7 +142,12 @@ public void newInstance_returnsAnExistingInstance() throws InvalidArgumentExcept

@Test(expected = InvalidArgumentException.class)
public void newInstance_throwsAnExceptionWhenActivityIsNull() throws InvalidArgumentException {
BraintreeFragment.newInstance(null, TOKENIZATION_KEY);
BraintreeFragment.newInstance((AppCompatActivity) null, TOKENIZATION_KEY);
}

@Test(expected = InvalidArgumentException.class)
public void newInstance_throwsAnExceptionWhenFragmentIsNull() throws InvalidArgumentException {
BraintreeFragment.newInstance((Fragment) null, TOKENIZATION_KEY);
}

@Test(expected = InvalidArgumentException.class)
Expand Down