1 package de.dhbwloe.campusapp;
3 import android.os.Bundle;
4 import android.support.v4.app.Fragment;
5 import android.support.v4.app.FragmentActivity;
6 import android.support.v4.app.FragmentTransaction;
7 import android.view.Gravity;
8 import android.view.View;
9 import android.widget.LinearLayout;
10 import android.widget.PopupWindow;
12 import java.lang.reflect.Constructor;
13 import java.lang.reflect.InvocationTargetException;
14 import java.util.ArrayList;
16 import de.dhbwloe.campusapp.fragments.PopupFragment;
19 * Created by pk910 on 19.01.2016.
21 public class NavigationManager {
22 private class NavPage {
24 Class<CampusAppFragment> fragmentClass;
25 int fragmentType; // 0 = normal; 1 = fullscreen; 2 = popup
28 private CampusAppContext AppContext;
29 private NavPage oCurrentPage;
30 private NavPage oParentPage;
31 private Fragment oCurrentFragment;
32 private Fragment oParentFragment;
33 private int iFragmentContainerId;
34 private ArrayList<NavPage> lNavigationPages = new ArrayList<NavPage>();
36 public NavigationManager(CampusAppContext context, int fragmentContainer) {
38 iFragmentContainerId = fragmentContainer;
42 public void registerPage(String name, Class<?> fragment, int fragmentType) {
43 NavPage page = new NavPage();
45 page.fragmentClass = (Class<CampusAppFragment>) fragment;
46 page.fragmentType = fragmentType;
47 lNavigationPages.add(page);
50 public String getCurrentPageName() {
51 if(oCurrentPage == null)
53 return oCurrentPage.name;
56 public CampusAppFragment getCurrentFragment() {
57 if(oCurrentPage == null)
59 if(oCurrentPage.fragmentType != 3)
60 return (CampusAppFragment)oCurrentFragment;
64 public void navigatePage(String name) {
65 navigatePage(name, null, true);
68 public void navigatePage(String name, Bundle args) {
69 navigatePage(name, args, true);
72 public void navigatePage(String name, Bundle args, boolean history) {
74 NavPage page = getPageByName(name);
79 if(page.fragmentType == 3) {
80 PopupFragment popupFragment = new PopupFragment();
83 args.putString("target", "#"+page.name);
84 fragment = popupFragment;
86 fragment = getFragmentOfPage(page);
89 fragment.setArguments(args);
91 FragmentActivity fragmentActivity = (FragmentActivity) AppContext.getMainActivity();
92 FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
94 if (oCurrentPage != null && oCurrentPage.fragmentType == 3) {
95 transaction.remove(oCurrentFragment);
96 oCurrentPage = oParentPage;
97 oCurrentFragment = oParentFragment;
99 if (page.fragmentType == 3) {
100 transaction.add(fragment, "popup");
101 oParentPage = oCurrentPage;
102 oParentFragment = oCurrentFragment;
104 } else if (oCurrentPage != null) {
105 transaction.replace(iFragmentContainerId, fragment);
107 transaction.add(iFragmentContainerId, fragment);
110 transaction.addToBackStack(null);
113 oCurrentFragment = fragment;
115 transaction.commit();
118 private NavPage getPageByName(String name) {
120 for(int i = 0; i < lNavigationPages.size(); i++) {
121 if(lNavigationPages.get(i).name.equalsIgnoreCase(name)) {
122 page = lNavigationPages.get(i);
132 private CampusAppFragment getFragmentOfPage(NavPage page) {
133 Class<CampusAppFragment> fragmentClass = page.fragmentClass;
134 Constructor fragmentConstructor;
135 CampusAppFragment fragment;
137 fragmentConstructor = fragmentClass.asSubclass(fragmentClass).getConstructor();
138 fragment = (CampusAppFragment)fragmentConstructor.newInstance(new Object[]{});
139 } catch (Exception e) {
145 public CampusAppFragment getPageFragment(String name) {
146 NavPage page = getPageByName(name);
149 return getFragmentOfPage(page);
152 public PopupFragment getDialog() {
153 if(oCurrentPage != null && oCurrentPage.fragmentType == 3) {
154 PopupFragment fragment = (PopupFragment) oCurrentFragment;
160 public boolean closeDialog() {
161 if(oCurrentPage != null && oCurrentPage.fragmentType == 3) {
162 PopupFragment fragment = (PopupFragment) oCurrentFragment;
163 fragment.destroyView();
165 FragmentActivity fragmentActivity = (FragmentActivity) AppContext.getMainActivity();
166 FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
168 transaction.remove(oCurrentFragment);
170 oCurrentPage = oParentPage;
171 oCurrentFragment = oParentFragment;
173 transaction.commit();
179 public boolean back() {
180 return closeDialog();