1 /* CampusAppContext.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.app.Activity;
19 import android.os.Bundle;
20 import android.util.Log;
21 import android.widget.TextView;
23 import java.lang.reflect.Method;
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;
45 * A context, that is pushed to each fragment.
46 * This context will be persistent during app execution.
48 public class CampusAppContext {
49 private class AppPage {
54 public AppPage(String name, Class<?> fragment) {
56 this.fragment = fragment;
59 public AppPage(String name, Class<?> fragment, int type) {
61 this.fragment = fragment;
62 this.fragementType = type;
65 public class NavigationItem {
70 public static final String APPVERSION = "0.1.5 (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";
77 new NavigationItem() {{
78 navItemId = R.id.nav_vorlesungsplan;
79 navTarget = "Vorlesungsplan";
81 new NavigationItem() {{
82 navItemId = R.id.nav_mensa;
85 new NavigationItem() {{
86 navItemId = R.id.nav_mensa;
89 new NavigationItem() {{
90 navItemId = R.id.nav_news;
93 new NavigationItem() {{
94 navItemId = R.id.nav_settings;
95 navTarget = "Settings";
97 new NavigationItem() {{
98 navItemId = R.id.nav_wifi;
99 navTarget = "WifiSettings";
101 new NavigationItem() {{
102 navItemId = R.id.nav_impressum;
103 navTarget = "Impressum";
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)
123 private static CampusAppContext instance;
124 public static CampusAppContext getInstance() {
128 private Activity oMainActivity;
129 private NavigationManager oNavigationManager;
130 private DatabaseManager oDatabaseManager;
131 private NfcCardListener oNfcCardListener;
132 private Bundle oContextVariables;
133 private CampusAppCrashHandler oExceptionHandler;
135 public CampusAppContext(CampusApp mainActivity, int fragmentContainerId, int navigationViewId) {
136 final CampusAppContext AppContext = this;
139 oMainActivity = mainActivity;
140 oContextVariables = new Bundle();
141 oNavigationManager = new NavigationManager(this, fragmentContainerId, navigationViewId);
142 oDatabaseManager = new DatabaseManager(this);
143 oNfcCardListener = new NfcCardListener(this);
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);
149 oNfcCardListener.registerNfcCardInterface(new NfcCardInterface() {
151 public void onNfcReaderStateChanged(boolean state) {
156 public void onNfcReaderReceived(NfcCardData data) {
158 AppContext.onNfcCardDataReceived(data);
163 public Activity getMainActivity() {
164 return oMainActivity;
166 public void setMainActivity(Activity activity) {
167 oMainActivity = activity;
170 public NavigationManager getNavigationManager() {
171 return oNavigationManager;
174 public void setTitle(String title) {
175 // Ändern des Titels (Im App Header angezeigt)
176 PopupFragment popup = oNavigationManager.getDialog();
178 if(popup.getDialog() != null)
179 popup.getDialog().setTitle(title);
181 TextView titleView = (TextView)oMainActivity.findViewById(R.id.title);
182 titleView.setText(title);
186 public DatabaseManager getDatabaseManager() {
187 return oDatabaseManager;
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++) {
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) {
203 public void addSearchIndices(SearchIndices[] indices) {
204 oDatabaseManager.addSearchIndices(indices);
207 public NfcCardListener getNfcCardListener() {
208 return oNfcCardListener;
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);
218 oContextVariables.putInt("nfcCardUniqueId", data.getUniqueId());
219 oContextVariables.putDouble("nfcCardBalance", cardBalance);
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);
227 oNavigationManager.navigatePage("MensaCard", bundle);
230 public Bundle getContextVariables() {
231 return oContextVariables;
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);
240 public String getResString(int id) {
241 String str = oMainActivity.getResources().getString(id);