diff --git a/src/main/java/org/roboswag/components/navigation/AbstractBaseActivity.java b/src/main/java/org/roboswag/components/navigation/AbstractBaseActivity.java index f5c5bfb..d7c3bf5 100644 --- a/src/main/java/org/roboswag/components/navigation/AbstractBaseActivity.java +++ b/src/main/java/org/roboswag/components/navigation/AbstractBaseActivity.java @@ -112,18 +112,7 @@ public abstract class AbstractBaseActivity extends AppCompatActivity fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } - final T fragment; - try { - fragment = (T) Fragment.instantiate(this, fragmentClass.getName(), args); - } catch (Exception ex) { - //TODO: log - return null; - } - fragmentManager.beginTransaction() - .replace(getFragmentContainerId(), fragment, null) - .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) - .commit(); - return fragment; + return setFragment(fragmentClass); } @Nullable @@ -148,7 +137,7 @@ public abstract class AbstractBaseActivity extends AppCompatActivity .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .addToBackStack(backStackTag) .commit(); - return (T) fragment; + return fragment; } /* Setting fragment of special class as top */ @@ -172,10 +161,16 @@ public abstract class AbstractBaseActivity extends AppCompatActivity } /* Raises when device back button pressed */ + @SuppressWarnings("PMD.AvoidLiteralsInIfCondition") + //TODO: wait for 1 to be ignored @Override public void onBackPressed() { - if (!UiUtils.tryForeachFragment(getSupportFragmentManager(), AbstractBaseFragment::onBackPressed)) { - super.onBackPressed(); + if (!UiUtils.tryForeachFragment(getSupportFragmentManager(), fragment -> fragment.onBackPressed(this))) { + if (getSupportFragmentManager().getBackStackEntryCount() <= 1) { + supportFinishAfterTransition(); + } else { + getSupportFragmentManager().popBackStackImmediate(); + } } } @@ -186,7 +181,7 @@ public abstract class AbstractBaseActivity extends AppCompatActivity final FragmentManager fragmentManager = getSupportFragmentManager(); - if (UiUtils.tryForeachFragment(fragmentManager, AbstractBaseFragment::onHomePressed)) { + if (UiUtils.tryForeachFragment(fragmentManager, fragment -> fragment.onHomePressed(this))) { return true; } @@ -234,6 +229,19 @@ public abstract class AbstractBaseActivity extends AppCompatActivity } } + public void popBackStackToTopFragment() { + final FragmentManager fragmentManager = getSupportFragmentManager(); + final int stackSize = fragmentManager.getBackStackEntryCount(); + String currentFragmentName = null; + for (int i = stackSize - 2; i >= 0; i--) { + currentFragmentName = fragmentManager.getBackStackEntryAt(i).getName(); + if (currentFragmentName.endsWith(TOP_FRAGMENT_TAG_MARK)) { + break; + } + } + fragmentManager.popBackStackImmediate(currentFragmentName, 0); + } + /* Shows device keyboard */ public void showSoftInput(@NonNull final View view) { final InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); diff --git a/src/main/java/org/roboswag/components/navigation/AbstractBaseFragment.java b/src/main/java/org/roboswag/components/navigation/AbstractBaseFragment.java index 3817717..c87a40b 100644 --- a/src/main/java/org/roboswag/components/navigation/AbstractBaseFragment.java +++ b/src/main/java/org/roboswag/components/navigation/AbstractBaseFragment.java @@ -42,7 +42,7 @@ import java.util.Map; * TODO: fill description */ // Yes, it's a God class with a lot of methods. Deal with it -@SuppressWarnings({"PMD.GodClass","PMD.TooManyMethods"}) +@SuppressWarnings({"PMD.GodClass", "PMD.TooManyMethods"}) public abstract class AbstractBaseFragment extends Fragment implements OnFragmentStartedListener { @@ -140,13 +140,13 @@ public abstract class AbstractBaseFragment fragment.onBackPressed(baseActivity)); } /* Raises when ActionBar home button pressed */ - public boolean onHomePressed() { - return UiUtils.tryForeachFragment(getChildFragmentManager(), AbstractBaseFragment::onHomePressed); + public boolean onHomePressed(@NonNull final AbstractBaseActivity baseActivity) { + return UiUtils.tryForeachFragment(getChildFragmentManager(), fragment -> fragment.onHomePressed(baseActivity)); } @Deprecated