package com.circlegate.liban.utils;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
public class FragmentUtils {
private static final String BUNDLE_SINGLE_ARG_PARCELABLE = FragmentUtils.class.getName() + ".SINGLE_ARG_PACELABLE";
private static final String NESTED_FRAGMENT_TAG_DELIMITER = "|||";
private static final String NESTED_FRAGMENT_TAG_DELIMITER_ESCAPED = "\\|\\|\\|";
public static String getTagNotNull(Fragment f) {
String ret = f.getTag();
if (ret == null)
throw new IllegalArgumentException("Fragment must have its tag assigned!");
return ret;
}
public static String getNestedTagNotNull(Fragment f) {
String ret = getTagNotNull(f);
Fragment parent = f.getParentFragment();
if (parent != null)
return getNestedTagNotNull(parent) + NESTED_FRAGMENT_TAG_DELIMITER + ret;
else
return ret;
}
public static Fragment findFragmentByNestedTag(FragmentActivity activity, String nestedFragmentTag) {
String[] splitted = nestedFragmentTag.split(NESTED_FRAGMENT_TAG_DELIMITER_ESCAPED);
FragmentManager fm = activity.getSupportFragmentManager();
for (int i = 0; i < splitted.length; i++) {
Fragment f = fm.findFragmentByTag(splitted[i]);
if (f == null || i + 1 == splitted.length)
return f;
else
fm = f.getChildFragmentManager();
}
throw new RuntimeException("Not implemented");
}
public static <T extends Fragment> T setArgumentParcelable(T fragment, Parcelable p) {
Bundle b = new Bundle();
b.putParcelable(BUNDLE_SINGLE_ARG_PARCELABLE, p);
return setArguments(fragment, b);
}
public static <T extends Fragment> T setArguments(T fragment, Bundle b) {
fragment.setArguments(b);
return fragment;
}
public static <T extends Parcelable> T getArgumentParcelable(Fragment fragment) {
return fragment.getArguments().getParcelable(BUNDLE_SINGLE_ARG_PARCELABLE);
}
// /**
// * Nasty hack :) V soucasne dobe neni zadny o moc lepsi zpusob, jak z viewPageru dostat aktualni fragment
// */
// public static Fragment getViewPagerCurrentFragment(FragmentManager fm, ViewPager viewPager) {
// return getViewPagerFragmentAt(fm, viewPager, viewPager.getCurrentItem());
// }
//
// public static Fragment getViewPagerFragmentAt(FragmentManager fm, ViewPager viewPager, int index) {
// String tag = "android:switcher:" + viewPager.getId() + ":" + index;
// Fragment f = fm.findFragmentByTag(tag);
// //Log.d("getViewPagerCurrentFragment", "" + viewPager.getCurrentItem() + ": " + (f == null ? "null" : (f.getTag() == null ? "tag: null" : f.getTag())));
// return f;
//
//// int index = viewPager.getCurrentItem();
//// if (index >= 0)
//// return (Fragment)viewPager.getAdapter().instantiateItem(viewPager, viewPager.getCurrentItem());
//// else
//// return null;
// }
public static <T extends DialogFragment> T showDialogRemoveOldOne(FragmentManager fm, DialogFragment oldDialog, T newDialog, String fragmentTag) {
FragmentTransaction ft = fm.beginTransaction();
if (oldDialog == null) {
oldDialog = (DialogFragment)fm.findFragmentByTag(fragmentTag);
}
if (oldDialog != null) {
ft.remove(oldDialog);
}
newDialog.show(ft, fragmentTag);
return newDialog;
}
public static void removeDialog(FragmentManager fm, DialogFragment dialog, String fragmentTag) {
if (dialog == null) {
dialog = (DialogFragment)fm.findFragmentByTag(fragmentTag);
}
if (dialog != null) {
fm.beginTransaction().remove(dialog).commit();
}
}
}