/**
  * Get the complete backstack
  *
  * @return the complete backstack for every tab
  */
 public ConcurrentHashMap<Integer, ArrayList<FragmentStateHolder>> getBackStack() {
   ArrayList<FragmentStateHolder> fragmentsStack = mMapOfStacks.get(mCurrentlyShownStack);
   FragmentStateHolder currentFragmentStateHolder = fragmentsStack.get(fragmentsStack.size() - 1);
   Fragment currentFragment =
       mFragmentManager.findFragmentByTag(currentFragmentStateHolder.fragmentTag);
   if (currentFragment != null && currentFragment instanceof TomahawkFragment) {
     currentFragmentStateHolder.listScrollPosition =
         ((TomahawkFragment) currentFragment).getListScrollPosition();
     fragmentsStack.set(fragmentsStack.size() - 1, currentFragmentStateHolder);
   }
   return mMapOfStacks;
 }
 /**
  * Get the complete backstack
  *
  * @return the complete backstack
  */
 public ArrayList<FragmentStateHolder> getBackStack() {
   FragmentStateHolder currentFragmentStateHolder = getCurrentFragmentStateHolder();
   Fragment currentFragment = null;
   if (mFragmentManager != null && mFragmentManager.getFragments() != null) {
     currentFragment = mFragmentManager.getFragments().get(0);
   }
   if (currentFragment != null && currentFragment instanceof TomahawkFragment) {
     currentFragmentStateHolder.listScrollPosition =
         ((TomahawkFragment) currentFragment).getListScrollPosition();
     mBackstack.set(mBackstack.size() - 1, currentFragmentStateHolder);
   }
   return mBackstack;
 }
 /**
  * Replaces the {@link Fragment} in the hub with the given hub id and adds it to the backstack, if
  * isBackAction is false.
  *
  * @param fragmentStateHolder {@link FragmentStateHolder} contains all information of the to be
  *     replaced {@link Fragment}
  * @param isBackAction whether or not the replacement is part of an action going back in the
  *     backstack
  */
 public void replace(FragmentStateHolder fragmentStateHolder, boolean isBackAction) {
   // Get fragmentsStack for the given (tabs)position
   FragmentStateHolder currentFragmentStateHolder = getCurrentFragmentStateHolder();
   // Replace the fragment using a transaction.
   FragmentTransaction ft = mFragmentManager.beginTransaction();
   if (isBackAction) {
     mBackstack.remove(currentFragmentStateHolder);
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
   } else {
     Fragment currentFragment = null;
     if (mFragmentManager != null && mFragmentManager.getFragments() != null) {
       currentFragment = mFragmentManager.findFragmentByTag(FRAGMENT_TAG);
     }
     if (currentFragmentStateHolder != null
         && currentFragment != null
         && currentFragment instanceof TomahawkFragment) {
       currentFragmentStateHolder.listScrollPosition =
           ((TomahawkFragment) currentFragment).getListScrollPosition();
     }
     mBackstack.add(fragmentStateHolder);
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
   }
   Bundle bundle = new Bundle();
   bundle.putString(
       fragmentStateHolder.tomahawkListItemType, fragmentStateHolder.tomahawkListItemKey);
   bundle.putBoolean(
       TomahawkFragment.TOMAHAWK_LIST_ITEM_IS_LOCAL, fragmentStateHolder.tomahawkListItemIsLocal);
   bundle.putInt(
       TomahawkFragment.TOMAHAWK_LIST_SCROLL_POSITION, fragmentStateHolder.listScrollPosition);
   bundle.putString(
       SearchableFragment.SEARCHABLEFRAGMENT_QUERY_STRING, fragmentStateHolder.queryString);
   ft.replace(
       mContentFrameId,
       Fragment.instantiate(mTomahawkMainActivity, fragmentStateHolder.clss.getName(), bundle),
       FRAGMENT_TAG);
   ft.commit();
   mTomahawkMainActivity.updateViewVisibility();
 }
 /** Replaces the view pager fragment at specified position. */
 public void replace(int stackId, FragmentStateHolder fragmentStateHolder, boolean isBackAction) {
   // Get fragmentsStack for the given (tabs)position
   ArrayList<FragmentStateHolder> fragmentStateHolders = mMapOfStacks.get(stackId);
   FragmentStateHolder currentFragmentStateHolder =
       fragmentStateHolders.get(fragmentStateHolders.size() - 1);
   if (currentFragmentStateHolder != null) {
     // Replace the fragment using a transaction.
     FragmentTransaction ft = mFragmentManager.beginTransaction();
     if (isBackAction) {
       fragmentStateHolders.remove(currentFragmentStateHolder);
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
     } else {
       Fragment currentFragment =
           mFragmentManager.findFragmentByTag(currentFragmentStateHolder.fragmentTag);
       if (currentFragment != null && currentFragment instanceof TomahawkFragment) {
         currentFragmentStateHolder.listScrollPosition =
             ((TomahawkFragment) currentFragment).getListScrollPosition();
       }
       fragmentStateHolders.add(fragmentStateHolder);
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
     }
     Bundle bundle = new Bundle();
     bundle.putLong(
         fragmentStateHolder.tomahawkListItemType, fragmentStateHolder.tomahawkListItemId);
     bundle.putInt(
         TomahawkFragment.TOMAHAWK_LIST_SCROLL_POSITION, fragmentStateHolder.listScrollPosition);
     bundle.putString(
         SearchableFragment.SEARCHABLEFRAGMENT_QUERY_STRING, fragmentStateHolder.queryString);
     ft.replace(
         mContentFrameId,
         Fragment.instantiate(mActivity, fragmentStateHolder.clss.getName(), bundle),
         fragmentStateHolder.fragmentTag);
     ft.commit();
   }
   mActivity.onBackStackChanged();
 }