public class ScreenNavigator {
public static final String SCREEN_TRANSITION = "SCREEN_TRANSITION";
public static final String SCREEN_NAME = "SCREEN_NAME";
public static final String SCREEN_TRANSITION_DIRECTION = "SCREEN_TRANSITION_DIRECTION";
private Navigator navigator;
public ScreenNavigator(FragmentActivity activity, int containerViewId, Class screenClass) {
this.navigator = initNavigator(activity, containerViewId, screenClass);
}
public static Set<Field> findFieldsWithAnnotation(Class<?> classs, Class<? extends Annotation> ann) {
Set<Field> set = new HashSet<>();
Class<?> c = classs;
while (c != null) {
for (Field field : c.getDeclaredFields()) {
if (field.isAnnotationPresent(ann)) {
set.add(field);
}
}
c = c.getSuperclass();
}
return set;
}
private SupportAppNavigator initNavigator(final FragmentActivity activity, int containerViewId, final Class screenClass) {
return new SupportAppNavigator(activity, containerViewId) {
@Override protected Intent createActivityIntent(String screenKey, Object data) {
Map<String, Class<? extends Activity>> activities = getActivitiesScreens(screenClass);
if (!activities.containsKey(screenKey)) return null;
Intent intent = new Intent(activity, activities.get(screenKey));
if (data != null) {
Bundle bundle = (Bundle) data;
intent.putExtras(bundle);
}
return intent;
}
@Override protected Fragment createFragment(String screenKey, Object data) {
Map<String, Class<? extends Fragment>> fragments = getFragmentScreens(screenClass);
if (!fragments.containsKey(screenKey)) {
return null;
}
Fragment fragment = null;
try {
fragment = fragments.get(screenKey).newInstance();
int direction = Gravity.BOTTOM;
if (data != null) {
direction = ((Bundle) data).getInt(SCREEN_TRANSITION_DIRECTION, Gravity.BOTTOM);
}
if (data == null || !((Bundle) data).containsKey(SCREEN_TRANSITION)) {
Slide slide = new Slide(direction);
slide.setDuration(250);
slide.setInterpolator(new LinearInterpolator());
fragment.setEnterTransition(slide);
}
if (data != null) {
Bundle bundle = ((Bundle) data);
bundle.putString(SCREEN_NAME, screenKey);
fragment.setArguments(bundle);
} else {
Bundle bundle = new Bundle();
bundle.putString(SCREEN_NAME, screenKey);
fragment.setArguments(bundle);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
if (activity instanceof MainActivity) {
((MainActivity) activity).changeBackground();
}
return fragment;
}
@Override protected void setupFragmentTransactionAnimation(Command command, Fragment currentFragment, Fragment nextFragment, FragmentTransaction fragmentTransaction) {
if (command instanceof Replace) {
if (((Replace) command).getTransitionData() != null) {
Bundle bundle = (Bundle) ((Replace) command).getTransitionData();