718b4b53803206ef84c450aa5abd205487f2b11e
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / CampusAppContext.java
1 /* CampusAppContext.java
2  *
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.
7  *
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.
12  *
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/>.
15  */
16 package de.dhbwloe.campusapp;
17
18 import android.app.Activity;
19 import android.os.Bundle;
20 import android.util.Log;
21 import android.widget.TextView;
22
23 import java.lang.reflect.Method;
24
25 import de.dhbwloe.campusapp.database.DatabaseManager;
26 import de.dhbwloe.campusapp.fragments.AppSearch;
27 import de.dhbwloe.campusapp.fragments.Dashboard;
28 import de.dhbwloe.campusapp.fragments.FirstRun;
29 import de.dhbwloe.campusapp.fragments.Impressum;
30 import de.dhbwloe.campusapp.fragments.Mensa;
31 import de.dhbwloe.campusapp.fragments.MensaCard;
32 import de.dhbwloe.campusapp.fragments.News;
33 import de.dhbwloe.campusapp.fragments.PopupFragment;
34 import de.dhbwloe.campusapp.fragments.Settings;
35 import de.dhbwloe.campusapp.fragments.SplashScreen;
36 import de.dhbwloe.campusapp.fragments.Vorlesungsplan;
37 import de.dhbwloe.campusapp.fragments.WebBrowser;
38 import de.dhbwloe.campusapp.fragments.WifiSettings;
39 import de.dhbwloe.campusapp.nfcreader.NfcCardInterface;
40 import de.dhbwloe.campusapp.nfcreader.NfcCardListener;
41 import de.dhbwloe.campusapp.database.NfcCardData;
42 import de.dhbwloe.campusapp.search.SearchIndices;
43
44 /** CampusAppContext
45  * A context, that is pushed to each fragment.
46  * This context will be persistent during app execution.
47  */
48 public class CampusAppContext {
49     private class AppPage {
50         String name;
51         Class<?> fragment;
52         int fragementType;
53
54         public AppPage(String name, Class<?> fragment) {
55             this.name = name;
56             this.fragment = fragment;
57         }
58
59         public AppPage(String name, Class<?> fragment, int type) {
60             this.name = name;
61             this.fragment = fragment;
62             this.fragementType = type;
63         }
64     }
65     public class NavigationItem {
66         int navItemId;
67         String navTarget;
68     };
69
70     public static final String APPVERSION = "0.1.4 (beta)";
71     public static final boolean DEBUG = true;
72     public final NavigationItem[] NAVIGATION_TARGETS = new NavigationItem[] {
73             new NavigationItem() {{
74                 navItemId = R.id.nav_dashboard;
75                 navTarget = "Dashboard";
76             }},
77             new NavigationItem() {{
78                 navItemId = R.id.nav_vorlesungsplan;
79                 navTarget = "Vorlesungsplan";
80             }},
81             new NavigationItem() {{
82                 navItemId = R.id.nav_mensa;
83                 navTarget = "Mensa";
84             }},
85             new NavigationItem() {{
86                 navItemId = R.id.nav_mensa;
87                 navTarget = "Mensa";
88             }},
89             new NavigationItem() {{
90                 navItemId = R.id.nav_news;
91                 navTarget = "News";
92             }},
93             new NavigationItem() {{
94                 navItemId = R.id.nav_settings;
95                 navTarget = "Settings";
96             }},
97             new NavigationItem() {{
98                 navItemId = R.id.nav_wifi;
99                 navTarget = "WifiSettings";
100             }},
101             new NavigationItem() {{
102                 navItemId = R.id.nav_impressum;
103                 navTarget = "Impressum";
104             }},
105
106     };
107     private final AppPage[] PAGES = { // Hier müssen alle Fragmente, die auf der Activity angezeigt werden sollen eingetragen werden.
108             new AppPage("SplashScreen", SplashScreen.class),
109             new AppPage("Dashboard", Dashboard.class),
110             new AppPage("AppSearch", AppSearch.class),
111             new AppPage("Vorlesungsplan", Vorlesungsplan.class),
112             new AppPage("Mensa", Mensa.class),
113             new AppPage("MensaCard", MensaCard.class, 3),
114             new AppPage("News", News.class),
115             new AppPage("WifiSettings", WifiSettings.class),
116             new AppPage("FirstRun", FirstRun.class),
117             new AppPage("Settings", Settings.class),
118             new AppPage("Impressum", Impressum.class),
119             new AppPage("WebBrowser", WebBrowser.class),
120             new AppPage("WebBrowserPopup", WebBrowser.class, 3)
121     };
122
123     private static CampusAppContext instance;
124     public static CampusAppContext getInstance() {
125         return instance;
126     }
127
128     private Activity oMainActivity;
129     private NavigationManager oNavigationManager;
130     private DatabaseManager oDatabaseManager;
131     private NfcCardListener oNfcCardListener;
132     private Bundle oContextVariables;
133     private CampusAppCrashHandler oExceptionHandler;
134
135     public CampusAppContext(CampusApp mainActivity, int fragmentContainerId, int navigationViewId) {
136         final CampusAppContext AppContext = this;
137         instance = this;
138
139         oMainActivity = mainActivity;
140         oContextVariables = new Bundle();
141         oNavigationManager = new NavigationManager(this, fragmentContainerId, navigationViewId);
142         oDatabaseManager = new DatabaseManager(this);
143         oNfcCardListener = new NfcCardListener(this);
144
145         // Alle Fragmente "registrieren"
146         for(int i = 0; i < PAGES.length; i++)
147             oNavigationManager.registerPage(PAGES[i].name, PAGES[i].fragment, PAGES[i].fragementType);
148
149         oNfcCardListener.registerNfcCardInterface(new NfcCardInterface() {
150             @Override
151             public void onNfcReaderStateChanged(boolean state) {
152
153             }
154
155             @Override
156             public void onNfcReaderReceived(NfcCardData data) {
157                 if (data != null)
158                     AppContext.onNfcCardDataReceived(data);
159             }
160         });
161     }
162
163     public Activity getMainActivity() {
164         return oMainActivity;
165     }
166     public void setMainActivity(Activity activity) {
167         oMainActivity = activity;
168     }
169
170     public NavigationManager getNavigationManager() {
171         return oNavigationManager;
172     }
173
174     public void setTitle(String title) {
175         // Ändern des Titels (Im App Header angezeigt)
176         PopupFragment popup = oNavigationManager.getDialog();
177         if(popup != null) {
178             if(popup.getDialog() != null)
179                 popup.getDialog().setTitle(title);
180         } else {
181             TextView titleView = (TextView)oMainActivity.findViewById(R.id.title);
182             titleView.setText(title);
183         }
184     }
185
186     public DatabaseManager getDatabaseManager() {
187         return oDatabaseManager;
188     }
189
190     public void addDefaultSearchIndexes() {
191         // Alle Search Indices der eigetragenen Seiten beziehen und in der Datenbank speichern
192         for(int i = 0; i < PAGES.length; i++) {
193             try {
194                 Method m = PAGES[i].fragment.getMethod("GetSearchIndices");
195                 Object result = m.invoke(null);
196                 SearchIndices[] indices = (SearchIndices[]) result;
197                 addSearchIndices(indices);
198             } catch (Exception e) {
199             }
200         }
201     }
202
203     public void addSearchIndices(SearchIndices[] indices) {
204         oDatabaseManager.addSearchIndices(indices);
205     }
206
207     public NfcCardListener getNfcCardListener() {
208         return oNfcCardListener;
209     }
210
211     private void onNfcCardDataReceived(NfcCardData data) {
212         // NFC Daten erhalten
213         Bundle bundle = new Bundle();
214         double cardBalance = data.getBalance() / 100.0;
215         bundle.putDouble("balance", cardBalance);
216         bundle.putDouble("transaction", data.getLastTransaction() / 100.0);
217
218         oContextVariables.putInt("nfcCardUniqueId", data.getUniqueId());
219         oContextVariables.putDouble("nfcCardBalance", cardBalance);
220
221         String pagename = oNavigationManager.getCurrentPageName();
222         // Update angezeigtes Guthaben lediglich, wenn das Fragment bereits angezeigt wird
223         if(pagename != null && pagename.equalsIgnoreCase("MensaCard")) {
224             MensaCard fragment = (MensaCard) oNavigationManager.getCurrentFragment();
225             fragment.showNfcCardData(bundle);
226         } else
227             oNavigationManager.navigatePage("MensaCard", bundle);
228     }
229
230     public Bundle getContextVariables() {
231         return oContextVariables;
232     }
233
234     public String getResString(int id, Object... arguments) {
235         // printf like resource strings
236         String format = getResString(id);
237         String res = String.format(format, arguments);
238         return res;
239     }
240     public String getResString(int id) {
241         String str = oMainActivity.getResources().getString(id);
242         return str;
243     }
244
245 }