fixed app for non nfc devices & fixed navigation after app pause & resume (it seems...
[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         return null;
70     }
71
72     public void navigatePage(String name) {
73         navigatePage(name, null, true);
74     }
75
76     public void navigatePage(String name, Bundle args) {
77         navigatePage(name, args, true);
78     }
79
80     public void navigatePage(String name, Bundle args, boolean history) {
81
82         NavPage page = getPageByName(name);
83         if(page == null)
84             return;
85         Fragment fragment;
86
87         if(page.fragmentType == 3) {
88             PopupFragment popupFragment = new PopupFragment();
89             if(args == null)
90                 args = new Bundle();
91             args.putString("target", "#"+page.name);
92             fragment = popupFragment;
93         } else {
94             fragment = getFragmentOfPage(page);
95         }
96
97         fragment.setArguments(args);
98
99         FragmentActivity fragmentActivity = (FragmentActivity) AppContext.getMainActivity();
100         FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
101
102         if (oCurrentPage != null && oCurrentPage.fragmentType == 3) {
103             transaction.remove(oCurrentFragment);
104             oCurrentPage = oParentPage;
105             oCurrentFragment = oParentFragment;
106         }
107         if (page.fragmentType == 3) {
108             transaction.add(fragment, "popup");
109             oParentPage = oCurrentPage;
110             oParentFragment = oCurrentFragment;
111             history = false;
112         } else {
113             // remove fragments
114             List<Fragment> al = fragmentActivity.getSupportFragmentManager().getFragments();
115             if(al != null) {
116                 for (Fragment frag : al) {
117                     if (frag != null && frag.isAdded()) {
118                         transaction.remove(frag);
119                     }
120                 }
121             }
122             transaction.add(iFragmentContainerId, fragment);
123         }
124         if (history)
125             transaction.addToBackStack(null);
126
127         oCurrentPage = page;
128         oCurrentFragment = fragment;
129
130         transaction.commit();
131     }
132
133     private NavPage getPageByName(String name) {
134         NavPage page = null;
135         for(int i = 0; i < lNavigationPages.size(); i++) {
136             if(lNavigationPages.get(i).name.equalsIgnoreCase(name)) {
137                 page = lNavigationPages.get(i);
138                 break;
139             }
140         }
141         if(page == null)
142             return null;
143
144         return page;
145     }
146
147     private CampusAppFragment getFragmentOfPage(NavPage page) {
148         Class<CampusAppFragment> fragmentClass = page.fragmentClass;
149         Constructor fragmentConstructor;
150         CampusAppFragment fragment;
151         try {
152             fragmentConstructor = fragmentClass.asSubclass(fragmentClass).getConstructor();
153             fragment = (CampusAppFragment)fragmentConstructor.newInstance(new Object[]{});
154         } catch (Exception e) {
155             return null;
156         }
157         return fragment;
158     }
159
160     public CampusAppFragment getPageFragment(String name) {
161         NavPage page = getPageByName(name);
162         if(page == null)
163             return null;
164         return getFragmentOfPage(page);
165     }
166
167     public PopupFragment getDialog() {
168         if(oCurrentPage != null && oCurrentPage.fragmentType == 3) {
169             PopupFragment fragment = (PopupFragment) oCurrentFragment;
170             return fragment;
171         }
172         return null;
173     }
174
175     public boolean closeDialog() {
176         if(oCurrentPage != null && oCurrentPage.fragmentType == 3) {
177             PopupFragment fragment = (PopupFragment) oCurrentFragment;
178             boolean wasAdded = false;
179             if(oCurrentFragment.isAdded()) {
180                 fragment.destroyView();
181
182                 FragmentActivity fragmentActivity = (FragmentActivity) AppContext.getMainActivity();
183                 FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
184
185                 transaction.remove(oCurrentFragment);
186                 transaction.commit();
187                 wasAdded = true;
188             }
189
190             oCurrentPage = oParentPage;
191             oCurrentFragment = oParentFragment;
192
193             return wasAdded;
194         }
195         return false;
196     }
197
198     public boolean back() {
199         return closeDialog();
200     }
201
202 }