/** * Builds a navigation context * * @return created navigation context */ public NavigationContext build() { return new NavigationContext(this); } }
@Override public boolean execute(NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { Activity activity = navigationContext.getActivity(); if (mScreenResult != null) { navigationContext.getScreenResultHelper().setActivityResult(activity, mScreenResult, navigationFactory); } Class<? extends Screen> screenClassFrom = navigationFactory.getScreenClass(activity); Class<? extends Screen> screenClassTo = navigationFactory.getPreviousScreenClass(activity); TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null && screenClassTo != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.BACK, screenClassFrom, screenClassTo, true, mAnimationData); } navigationContext.getActivityHelper().finish(animation); navigationContext.getTransitionListener().onScreenTransition(TransitionType.BACK, screenClassFrom, screenClassTo, true); return false; } }
@Override public boolean execute(DialogFragmentScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { DialogFragment dialogFragment = screenImplementation.createDialogFragment(mScreen); DialogAnimation animation = navigationContext.getDialogAnimationProvider().getAnimation(mScreen.getClass(), mAnimationData); navigationContext.getDialogFragmentHelper().showDialog(dialogFragment, animation); navigationContext.getDialogShowingListener().onDialogShown(mScreen.getClass()); return true; } }
@Override public boolean execute(NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { if (navigationContext.getDialogFragmentHelper().isDialogVisible()) { DialogFragmentHelper dialogFragmentHelper = navigationContext.getDialogFragmentHelper(); DialogFragment dialogFragment = dialogFragmentHelper.getDialogFragment(); dialogFragmentHelper.hideDialog(); navigationContext.getScreenResultHelper().callScreenResultListener(dialogFragment, mScreenResult, navigationContext.getScreenResultListener(), navigationFactory); return true; } else if (navigationContext.getFragmentStack() != null && navigationContext.getFragmentStack().getFragmentCount() > 1) { FragmentStack fragmentStack = navigationContext.getFragmentStack(); List<Fragment> fragments = fragmentStack.getFragments(); Fragment currentFragment = fragments.get(fragments.size() - 1); TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null && screenClassTo != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.BACK, screenClassFrom, screenClassTo, false, mAnimationData); navigationContext.getTransitionListener().onScreenTransition(TransitionType.BACK, screenClassFrom, screenClassTo, false); navigationContext.getScreenResultHelper().callScreenResultListener(currentFragment, mScreenResult, navigationContext.getScreenResultListener(), navigationFactory); return true; } else { Activity activity = navigationContext.getActivity(); if (mScreenResult != null) { navigationContext.getScreenResultHelper().setActivityResult(activity, mScreenResult, navigationFactory); TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null && screenClassTo != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.BACK, screenClassFrom, screenClassTo, true, mAnimationData); navigationContext.getActivityHelper().finish(animation);
@Override public boolean execute(FragmentScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { if (navigationContext.getFragmentStack() == null) { throw new MissingFragmentStackException("ContainerId is not set."); FragmentStack fragmentStack = navigationContext.getFragmentStack(); List<Fragment> fragments = fragmentStack.getFragments(); Fragment requiredFragment = null; TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.BACK, screenClassFrom, screenClassTo, false, mAnimationData); navigationContext.getTransitionListener().onScreenTransition(TransitionType.BACK, screenClassFrom, screenClassTo, false); if (mScreenResult != null || toPrevious) { navigationContext.getScreenResultHelper().callScreenResultListener(currentFragment, mScreenResult, navigationContext.getScreenResultListener(), navigationFactory);
@Override public boolean execute(FragmentScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { if (navigationContext.getFragmentStack() == null) { throw new MissingFragmentStackException("ContainerId is not set."); } Fragment fragment = screenImplementation.createFragment(mScreen); FragmentStack fragmentStack = navigationContext.getFragmentStack(); Fragment currentFragment = fragmentStack.getCurrentFragment(); Class<? extends Screen> screenClassFrom = currentFragment == null ? null : navigationFactory.getScreenClass(currentFragment); Class<? extends Screen> screenClassTo = mScreen.getClass(); TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.RESET, screenClassFrom, screenClassTo, false, mAnimationData); } fragmentStack.reset(fragment, animation); navigationContext.getTransitionListener().onScreenTransition(TransitionType.RESET, screenClassFrom, screenClassTo, false); return true; }
private void executeQueuedCommands() { if (mIsExecutingCommands) { return; } mIsExecutingCommands = true; try { while (mNavigationContext != null && !mCommandQueue.isEmpty()) { Command command = mCommandQueue.remove(); boolean canExecuteCommands = command.execute(mNavigationContext, mNavigationFactory); if (!canExecuteCommands) { mNavigationContext = null; } } } catch (NavigationException e) { mCommandQueue.clear(); mNavigationContext.getNavigationErrorListener().onNavigationError(e); } catch (Exception e) { mCommandQueue.clear(); throw e; } finally { mIsExecutingCommands = false; } }
@Override public void bind(NavigationContext navigationContext) { checkThatMainThread(); mNavigationContext = navigationContext; mActivityResultHandler.setScreenResultListener(mNavigationContext.getScreenResultListener()); executeQueuedCommands(); }
@Override public boolean execute(FragmentScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { if (navigationContext.getFragmentStack() == null) { throw new MissingFragmentStackException("ContainerId is not set."); } Fragment fragment = screenImplementation.createFragment(mScreen); FragmentStack fragmentStack = navigationContext.getFragmentStack(); Fragment currentFragment = fragmentStack.getCurrentFragment(); Class<? extends Screen> screenClassFrom = currentFragment == null ? null : navigationFactory.getScreenClass(currentFragment); Class<? extends Screen> screenClassTo = mScreen.getClass(); TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.REPLACE, screenClassFrom, screenClassTo, false, mAnimationData); } fragmentStack.replace(fragment, animation); navigationContext.getTransitionListener().onScreenTransition(TransitionType.REPLACE, screenClassFrom, screenClassTo, false); return true; }
@Override public boolean execute(ActivityScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { Activity activity = navigationContext.getActivity(); Intent intent = screenImplementation.createEmptyIntent(activity, mScreenClass); if (intent == null) { throw new ScreenRegistrationException("Can't create intent for a screen " + mScreenClass.getSimpleName()); } intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); if (mScreenResult != null) { navigationContext.getScreenResultHelper().setResultToIntent(intent, activity, mScreenResult, navigationFactory); } Class<? extends Screen> screenClassFrom = navigationFactory.getScreenClass(activity); Class<? extends Screen> screenClassTo = mScreenClass; TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.BACK, screenClassFrom, screenClassTo, true, mAnimationData); } navigationContext.getActivityHelper().start(intent, animation); navigationContext.getTransitionListener().onScreenTransition(TransitionType.BACK, screenClassFrom, screenClassTo, true); return false; }
@Override public boolean execute(DialogFragmentScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { DialogFragmentHelper dialogFragmentHelper = navigationContext.getDialogFragmentHelper(); if (dialogFragmentHelper.isDialogVisible()) { dialogFragmentHelper.hideDialog(); } DialogFragment dialogFragment = screenImplementation.createDialogFragment(mScreen); DialogAnimation animation = navigationContext.getDialogAnimationProvider().getAnimation(mScreen.getClass(), mAnimationData); dialogFragmentHelper.showDialog(dialogFragment, animation); navigationContext.getDialogShowingListener().onDialogShown(mScreen.getClass()); return true; } }
@Override public boolean execute(FragmentScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { if (navigationContext.getFragmentStack() == null) { throw new MissingFragmentStackException("ContainerId is not set."); } Fragment fragment = screenImplementation.createFragment(mScreen); if (fragment instanceof DialogFragment) { throw new ScreenRegistrationException("DialogFragment is used as usual Fragment."); } FragmentStack fragmentStack = navigationContext.getFragmentStack(); Fragment currentFragment = fragmentStack.getCurrentFragment(); Class<? extends Screen> screenClassFrom = currentFragment == null ? null : navigationFactory.getScreenClass(currentFragment); Class<? extends Screen> screenClassTo = mScreen.getClass(); TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.FORWARD, screenClassFrom, screenClassTo, false, mAnimationData); } fragmentStack.push(fragment, animation); navigationContext.getTransitionListener().onScreenTransition(TransitionType.FORWARD, screenClassFrom, screenClassTo, false); return true; }
@Override public boolean execute(ActivityScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { Activity activity = navigationContext.getActivity(); Intent intent = screenImplementation.createIntent(activity, mScreen, null); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); ActivityHelper activityHelper = navigationContext.getActivityHelper(); if (!activityHelper.resolve(intent)) { throw new ActivityResolvingException(mScreen); } Class<? extends Screen> screenClassFrom = navigationFactory.getScreenClass(activity); Class<? extends Screen> screenClassTo = mScreen.getClass(); TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.RESET, screenClassFrom, screenClassTo, true, mAnimationData); } activityHelper.start(intent, animation); navigationContext.getTransitionListener().onScreenTransition(TransitionType.RESET, screenClassFrom, screenClassTo, true); return false; }
@Override public boolean execute(DialogFragmentScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { DialogFragmentHelper dialogFragmentHelper = navigationContext.getDialogFragmentHelper(); while (dialogFragmentHelper.isDialogVisible()) { dialogFragmentHelper.hideDialog(); } DialogFragment dialogFragment = screenImplementation.createDialogFragment(mScreen); DialogAnimation animation = navigationContext.getDialogAnimationProvider().getAnimation(mScreen.getClass(), mAnimationData); dialogFragmentHelper.showDialog(dialogFragment, animation); navigationContext.getDialogShowingListener().onDialogShown(mScreen.getClass()); return true; } }
@Override public boolean execute(ActivityScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { Activity activity = navigationContext.getActivity(); Class<? extends Screen> previousScreenClass = navigationFactory.getPreviousScreenClass(activity); Intent intent = screenImplementation.createIntent(activity, mScreen, previousScreenClass); ActivityHelper activityHelper = navigationContext.getActivityHelper(); if (!activityHelper.resolve(intent)) { throw new ActivityResolvingException(mScreen); } Class<? extends Screen> screenClassFrom = navigationFactory.getScreenClass(activity); Class<? extends Screen> screenClassTo = mScreen.getClass(); TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.REPLACE, screenClassFrom, screenClassTo, true, mAnimationData); } activityHelper.start(intent, animation); activityHelper.finish(animation); navigationContext.getTransitionListener().onScreenTransition(TransitionType.REPLACE, screenClassFrom, screenClassTo, true); return false; }
@Override public boolean execute(ActivityScreenImplementation screenImplementation, NavigationContext navigationContext, NavigationFactory navigationFactory) throws NavigationException { Activity activity = navigationContext.getActivity(); Class<? extends Screen> previousScreenClass = navigationFactory.getScreenClass(activity); Intent intent = screenImplementation.createIntent(activity, mScreen, previousScreenClass); ActivityHelper activityHelper = navigationContext.getActivityHelper(); if (!activityHelper.resolve(intent)) { throw new ActivityResolvingException(mScreen); } Class<? extends Screen> screenClassFrom = navigationFactory.getScreenClass(activity); Class<? extends Screen> screenClassTo = mScreen.getClass(); TransitionAnimation animation = TransitionAnimation.DEFAULT; if (screenClassFrom != null) { animation = navigationContext.getTransitionAnimationProvider().getAnimation(TransitionType.FORWARD, screenClassFrom, screenClassTo, true, mAnimationData); } if (screenImplementation.getScreenResultClass() != null) { activityHelper.startForResult(intent, screenImplementation.getRequestCode(), animation); } else { activityHelper.start(intent, animation); } navigationContext.getTransitionListener().onScreenTransition(TransitionType.FORWARD, screenClassFrom, screenClassTo, true); return false; }