fixed title for popups
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / NavigationManager.java
1 package de.dhbwloe.campusapp;
2
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;
11
12 import java.lang.reflect.Constructor;
13 import java.lang.reflect.InvocationTargetException;
14 import java.util.ArrayList;
15 import java.util.List;
16
17 import de.dhbwloe.campusapp.fragments.PopupFragment;
18
19 /**
20  * Created by pk910 on 19.01.2016.
21  */
22 public class NavigationManager {
23     private class NavPage {
24         String name;
25         Class<CampusAppFragment> fragmentClass;
26         int fragmentType; // 0 = normal; 1 = fullscreen; 2 = popup
27     };
28
29     private CampusAppContext AppContext;
30     private NavPage oCurrentPage;
31     private NavPage oParentPage;
32     private Fragment oCurrentFragment;
33     private Fragment oParentFragment;
34     private int iFragmentContainerId;
35     private ArrayList<NavPage> lNavigationPages = new ArrayList<NavPage>();
36
37     public NavigationManager(CampusAppContext context, int fragmentContainer) {
38         AppContext = context;
39         iFragmentContainerId = fragmentContainer;
40         oCurrentPage = null;
41     }
42
43     public void registerPage(String name, Class<?> fragment, int fragmentType) {
44         NavPage page = new NavPage();
45         page.name = name;
46         page.fragmentClass = (Class<CampusAppFragment>) fragment;
47         page.fragmentType = fragmentType;
48         lNavigationPages.add(page);
49     }
50
51     public String getCurrentPageName() {
52         if(oCurrentPage == null)
53             return null;
54         if(oCurrentPage.fragmentType == 3 && oParentFragment != null){
55             if(oCurrentFragment.isAdded())
56                 return oCurrentPage.name;
57             else {
58                 closeDialog();
59             }
60         }
61         return oCurrentPage.name;
62     }
63
64     public CampusAppFragment getCurrentFragment() {
65         if(oCurrentPage == null)
66             return null;
67         if(oCurrentPage.fragmentType != 3)
68             return (CampusAppFragment)oCurrentFragment;
69         else
70             return ((PopupFragment)oCurrentFragment).getCurrentFragment();
71     }
72
73     public void navigatePage(String name) {
74         navigatePage(name, null, true);
75     }
76
77     public void navigatePage(String name, Bundle args) {
78         navigatePage(name, args, true);
79     }
80
81     public void navigatePage(String name, Bundle args, boolean history) {
82
83         NavPage page = getPageByName(name);
84         if(page == null)
85             return;
86         Fragment fragment;
87
88         if(page.fragmentType == 3) {
89             PopupFragment popupFragment = new PopupFragment();
90             if(args == null)
91                 args = new Bundle();
92             args.putString("target", "#"+page.name);
93             fragment = popupFragment;
94         } else {
95             fragment = getFragmentOfPage(page);
96         }
97
98         fragment.setArguments(args);
99
100         FragmentActivity fragmentActivity = (FragmentActivity) AppContext.getMainActivity();
101         FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
102
103         if (oCurrentPage != null && oCurrentPage.fragmentType == 3) {
104             transaction.remove(oCurrentFragment);
105             oCurrentPage = oParentPage;
106             oCurrentFragment = oParentFragment;
107         }
108         if (page.fragmentType == 3) {
109             transaction.add(fragment, "popup");
110             oParentPage = oCurrentPage;
111             oParentFragment = oCurrentFragment;
112             history = false;
113         } else {
114             // remove fragments
115             List<Fragment> al = fragmentActivity.getSupportFragmentManager().getFragments();
116             if(al != null) {
117                 for (Fragment frag : al) {
118                     if (frag != null && frag.isAdded()) {
119                         transaction.remove(frag);
120                     }
121                 }
122             }
123             transaction.add(iFragmentContainerId, fragment);
124         }
125         if (history)
126             transaction.addToBackStack(null);
127
128         oCurrentPage = page;
129         oCurrentFragment = fragment;
130
131         transaction.commit();
132     }
133
134     private NavPage getPageByName(String name) {
135         NavPage page = null;
136         for(int i = 0; i < lNavigationPages.size(); i++) {
137             if(lNavigationPages.get(i).name.equalsIgnoreCase(name)) {
138                 page = lNavigationPages.get(i);
139                 break;
140             }
141         }
142         if(page == null)
143             return null;
144
145         return page;
146     }
147
148     private CampusAppFragment getFragmentOfPage(NavPage page) {
149         Class<CampusAppFragment> fragmentClass = page.fragmentClass;
150         Constructor fragmentConstructor;
151         CampusAppFragment fragment;
152         try {
153             fragmentConstructor = fragmentClass.asSubclass(fragmentClass).getConstructor();
154             fragment = (CampusAppFragment)fragmentConstructor.newInstance(new Object[]{});
155         } catch (Exception e) {
156             return null;
157         }
158         return fragment;
159     }
160
161     public CampusAppFragment getPageFragment(String name) {
162         NavPage page = getPageByName(name);
163         if(page == null)
164             return null;
165         return getFragmentOfPage(page);
166     }
167
168     public PopupFragment getDialog() {
169         if(oCurrentPage != null && oCurrentPage.fragmentType == 3) {
170             PopupFragment fragment = (PopupFragment) oCurrentFragment;
171             return fragment;
172         }
173         return null;
174     }
175
176     public boolean closeDialog() {
177         if(oCurrentPage != null && oCurrentPage.fragmentType == 3) {
178             PopupFragment fragment = (PopupFragment) oCurrentFragment;
179             boolean wasAdded = false;
180             if(oCurrentFragment.isAdded()) {
181                 fragment.destroyView();
182
183                 FragmentActivity fragmentActivity = (FragmentActivity) AppContext.getMainActivity();
184                 FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
185
186                 transaction.remove(oCurrentFragment);
187                 transaction.commit();
188                 wasAdded = true;
189             }
190
191             oCurrentPage = oParentPage;
192             oCurrentFragment = oParentFragment;
193
194             return wasAdded;
195         }
196         return false;
197     }
198
199     public boolean back() {
200         return closeDialog();
201     }
202
203 }