1 /* NavigationManager.java
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 package de.dhbwloe.campusapp;
18 import android.os.Bundle;
19 import android.support.v4.app.Fragment;
20 import android.support.v4.app.FragmentActivity;
21 import android.support.v4.app.FragmentTransaction;
22 import android.view.Gravity;
23 import android.view.View;
24 import android.widget.LinearLayout;
25 import android.widget.PopupWindow;
27 import java.lang.reflect.Constructor;
28 import java.lang.reflect.InvocationTargetException;
29 import java.util.ArrayList;
30 import java.util.List;
32 import de.dhbwloe.campusapp.fragments.PopupFragment;
35 * Created by pk910 on 19.01.2016.
37 public class NavigationManager {
38 private class NavPage {
40 Class<CampusAppFragment> fragmentClass;
41 int fragmentType; // 0 = normal; 1 = fullscreen; 2 = popup
44 private CampusAppContext AppContext;
46 // Derzeitig angezeigtes Fragment
47 private NavPage oCurrentPage;
48 private Fragment oCurrentFragment;
50 // Hintergrund Fragment (bei Popups)
51 private NavPage oParentPage;
52 private Fragment oParentFragment;
55 private int iFragmentContainerId;
57 // Alle registrierte Fragmente mit Name
58 private ArrayList<NavPage> lNavigationPages = new ArrayList<NavPage>();
60 public NavigationManager(CampusAppContext context, int fragmentContainer) {
62 iFragmentContainerId = fragmentContainer;
66 public void registerPage(String name, Class<?> fragment, int fragmentType) {
67 NavPage page = new NavPage();
69 page.fragmentClass = (Class<CampusAppFragment>) fragment;
70 page.fragmentType = fragmentType;
71 lNavigationPages.add(page);
74 public String getCurrentPageName() {
75 if(oCurrentPage == null)
77 if(oCurrentPage.fragmentType == 3 && oParentFragment != null){
78 if(oCurrentFragment.isAdded())
79 return oCurrentPage.name;
84 return oCurrentPage.name;
87 public CampusAppFragment getCurrentFragment() {
88 if(oCurrentPage == null)
90 if(oCurrentPage.fragmentType != 3)
91 return (CampusAppFragment)oCurrentFragment;
93 return ((PopupFragment)oCurrentFragment).getCurrentFragment();
96 public void navigatePage(String name) {
97 navigatePage(name, null, true);
100 public void navigatePage(String name, Bundle args) {
101 navigatePage(name, args, true);
104 public void navigatePage(String name, Bundle args, boolean history) {
106 NavPage page = getPageByName(name);
111 // Wenn das Fragment als Popup angeziegt werden soll, muss zunächst das Popup Fragment geladen werden.
112 if(page.fragmentType == 3) {
113 PopupFragment popupFragment = new PopupFragment();
116 args.putString("target", "#"+page.name);
117 fragment = popupFragment;
119 fragment = getFragmentOfPage(page);
122 fragment.setArguments(args);
124 FragmentActivity fragmentActivity = (FragmentActivity) AppContext.getMainActivity();
125 FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
127 if (oCurrentPage != null && oCurrentPage.fragmentType == 3) {
128 transaction.remove(oCurrentFragment);
129 oCurrentPage = oParentPage;
130 oCurrentFragment = oParentFragment;
132 if (page.fragmentType == 3) {
133 transaction.add(fragment, "popup");
134 oParentPage = oCurrentPage;
135 oParentFragment = oCurrentFragment;
139 List<Fragment> al = fragmentActivity.getSupportFragmentManager().getFragments();
141 for (Fragment frag : al) {
142 if (frag != null && frag.isAdded()) {
143 transaction.remove(frag);
147 transaction.add(iFragmentContainerId, fragment);
149 if (history) // Hinzufügen zur App History (Zurück Button)
150 transaction.addToBackStack(null);
153 oCurrentFragment = fragment;
155 transaction.commit();
158 private NavPage getPageByName(String name) {
160 for(int i = 0; i < lNavigationPages.size(); i++) {
161 if(lNavigationPages.get(i).name.equalsIgnoreCase(name)) {
162 page = lNavigationPages.get(i);
172 private CampusAppFragment getFragmentOfPage(NavPage page) {
173 Class<CampusAppFragment> fragmentClass = page.fragmentClass;
174 Constructor fragmentConstructor;
175 CampusAppFragment fragment;
177 fragmentConstructor = fragmentClass.asSubclass(fragmentClass).getConstructor();
178 fragment = (CampusAppFragment)fragmentConstructor.newInstance(new Object[]{});
179 } catch (Exception e) {
185 public CampusAppFragment getPageFragment(String name) {
186 NavPage page = getPageByName(name);
189 return getFragmentOfPage(page);
192 public PopupFragment getDialog() {
193 if(oCurrentPage != null && oCurrentPage.fragmentType == 3) {
194 PopupFragment fragment = (PopupFragment) oCurrentFragment;
200 public boolean closeDialog() {
202 if(oCurrentPage != null && oCurrentPage.fragmentType == 3) {
203 PopupFragment fragment = (PopupFragment) oCurrentFragment;
204 boolean wasAdded = false;
205 if(oCurrentFragment.isAdded()) {
206 fragment.destroyView();
208 FragmentActivity fragmentActivity = (FragmentActivity) AppContext.getMainActivity();
209 FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
211 transaction.remove(oCurrentFragment);
212 transaction.commit();
216 oCurrentPage = oParentPage;
217 oCurrentFragment = oParentFragment;
224 public boolean back() {
225 return closeDialog();