Grundaufbau der App
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / CampusApp.java
1 package de.dhbwloe.campusapp;
2
3 import android.content.Context;
4 import android.content.Intent;
5 import android.nfc.NfcAdapter;
6 import android.os.Bundle;
7 import android.support.design.widget.FloatingActionButton;
8 import android.support.design.widget.Snackbar;
9 import android.support.v4.app.FragmentActivity;
10 import android.util.Log;
11 import android.view.KeyEvent;
12 import android.view.View;
13 import android.support.design.widget.NavigationView;
14 import android.support.v4.view.GravityCompat;
15 import android.support.v4.widget.DrawerLayout;
16 import android.support.v7.app.ActionBarDrawerToggle;
17 import android.support.v7.app.AppCompatActivity;
18 import android.support.v7.widget.Toolbar;
19 import android.view.Menu;
20 import android.view.MenuItem;
21 import android.view.inputmethod.EditorInfo;
22 import android.view.inputmethod.InputMethodManager;
23 import android.widget.EditText;
24 import android.widget.ImageView;
25 import android.widget.LinearLayout;
26 import android.widget.TextView;
27
28 import java.util.Date;
29
30 import de.dhbwloe.campusapp.nfcreader.NfcCardListener;
31
32 public class CampusApp extends FragmentActivity {
33
34     private boolean bSearchActive = false;
35     private CampusAppContext AppContext = null;
36
37     /*
38     * Dev Info:
39     *
40     * Die App besteht aus einer einzigen Activity, auf welcher dynamisch Fragmente platziert werden.
41     * Das Menü, sowie die Headerleiste befinden sich auf der Activity, sind dementsprechend immer verfügbar.
42     *
43     * Zur laufzeit der App wird eine einzige Instanz der Klasse CampusAppContext angelegt.
44     * Dieser Kontext dient als einstiegspunkt für sämmtliche global verfügbaren verwaltungs tools.
45     * Dazu gehören:
46     *   AppContext.getNavigationManager()    NavigationManager   Verwaltet die angezeigten Fragmente und deren Navigation
47     *                                                            .navigatePage("Dashboard")  to navigate to the Dashboard
48     *   ... to be continued ...
49      */
50
51     @Override
52     protected void onCreate(Bundle savedInstanceState) {
53         Log.i("CampusApp", "Event: onCreate");
54         super.onCreate(savedInstanceState);
55         setContentView(R.layout.activity_campus_app);
56
57         AppContext = CampusAppContext.getInstance();
58         if(AppContext == null)
59             AppContext = new CampusAppContext(this, R.id.fragment_container);
60         else
61             AppContext.setMainActivity(this);
62
63         boolean instantRestore = false;
64         if(savedInstanceState != null) {
65             long lastrun = savedInstanceState.getLong("lastrun");
66             if(((new Date()).getTime()/1000) - lastrun < 30) {
67                 instantRestore = true;
68
69                 AppContext.setTitle(savedInstanceState.getString("activetitle"));
70
71             }
72         }
73
74         prepareMainUi();
75         if(instantRestore) // orientation change
76             loadMainUi();
77         else
78             // don't add navigation to SlashScreen, or even from SplashScreen to Dashboard to the history log!
79             // it would be very strange to return to the SplashScreen or an "empty" page on return ;)
80             AppContext.getNavigationManager().navigatePage("SplashScreen", null, false);
81
82     }
83
84     @Override
85     public void onSaveInstanceState(Bundle savedInstanceState) {
86         Log.i("CampusApp", "Event: onSaveInstanceState");
87         // Save instance state during "restarts" due to orientation changes.
88         // We don't want to see the splash screen everytime the orientation changes ;)
89         savedInstanceState.putLong("lastrun", (new Date()).getTime() / 1000);
90         savedInstanceState.putString("activepage", AppContext.getNavigationManager().getCurrentPageName());
91         TextView titleView = (TextView) findViewById(R.id.title);
92         savedInstanceState.putString("activetitle", titleView.getText().toString());
93
94         // Always call the superclass so it can save the view hierarchy state
95         super.onSaveInstanceState(savedInstanceState);
96     }
97
98     public void prepareMainUi() {
99         ImageView btnOpenSearch = (ImageView) findViewById(R.id.search_button);
100         btnOpenSearch.setVisibility(View.GONE);
101     }
102
103     public void loadMainUi() {
104         ImageView btnOpenSearch = (ImageView) findViewById(R.id.search_button);
105
106         btnOpenSearch.setVisibility(View.VISIBLE);
107         setupActionBar();
108         setupSearchTriggers();
109
110         AppContext.getNfcCardListener().startNfcListener();
111     }
112
113     private void setupActionBar() {
114         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
115         DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
116         ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
117         drawer.setDrawerListener(toggle);
118         toggle.syncState();
119
120         NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
121         navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
122             @SuppressWarnings("StatementWithEmptyBody")
123             @Override
124             public boolean onNavigationItemSelected(MenuItem item) {
125                 // Handle navigation view item clicks here.
126                 int id = item.getItemId();
127
128                 switch (id) { // Navigation Items from res/menu/activity_campus_app_drawer.xml
129                     case R.id.nav_dashboard:
130                         AppContext.getNavigationManager().navigatePage("Dashboard");
131                         break;
132                     case R.id.nav_vorlesungsplan:
133                         AppContext.getNavigationManager().navigatePage("Vorlesungsplan");
134                         break;
135                     case R.id.nav_mensa:
136                         AppContext.getNavigationManager().navigatePage("Mensa");
137                         break;
138                     case R.id.nav_news:
139                         AppContext.getNavigationManager().navigatePage("News");
140                         break;
141                     case R.id.nav_settings:
142                         Intent settings = new Intent(AppContext.getMainActivity(), SettingsActivity.class);
143                         AppContext.getMainActivity().startActivity(settings);
144                         break;
145                     case R.id.nav_impressum:
146                         AppContext.getNavigationManager().navigatePage("Impressum");
147                         break;
148                     default:
149                         return false;
150                 }
151
152                 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
153                 drawer.closeDrawer(GravityCompat.START);
154                 return true;
155             }
156         });
157     }
158
159     private void setupSearchTriggers() {
160         ImageView btnOpenSearch = (ImageView) findViewById(R.id.search_button);
161         ImageView btnCloseSearch = (ImageView) findViewById(R.id.search_clear);
162         EditText edtSearchInput = (EditText) findViewById(R.id.search_input);
163         TextView txtTitle = (TextView) findViewById(R.id.title);
164
165         btnOpenSearch.setOnClickListener(new View.OnClickListener() {
166             @Override
167             public void onClick(View view) {
168                 triggerSearchPanel(true);
169             }
170         });
171         edtSearchInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
172             @Override
173             public void onFocusChange(View v, boolean hasFocus) {
174                 EditText edtSearchInput = (EditText) v;
175                 if (!hasFocus && edtSearchInput.getText().length() == 0) {
176                     triggerSearchPanel(false);
177                 }
178             }
179         });
180         edtSearchInput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
181             @Override
182             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
183                 if (actionId == EditorInfo.IME_ACTION_SEARCH) {
184                     EditText edtSearchInput = (EditText) v;
185                     triggerSearchAction(edtSearchInput.getText().toString());
186                     triggerSearchPanel(false);
187                     return true;
188                 }
189                 return false;
190             }
191         });
192         btnCloseSearch.setOnClickListener(new View.OnClickListener() {
193             @Override
194             public void onClick(View view) {
195                 EditText edtSearchInput = (EditText) findViewById(R.id.search_input);
196                 edtSearchInput.setText("");
197                 triggerSearchPanel(false);
198             }
199         });
200         txtTitle.setOnClickListener(new View.OnClickListener() {
201             @Override
202             public void onClick(View view) {
203                 triggerSearchPanel(true);
204             }
205         });
206
207     }
208
209     private void triggerSearchPanel(boolean show) {
210         if(bSearchActive == show)
211             return;
212         bSearchActive = show;
213         LinearLayout layTitleContainer = (LinearLayout) findViewById(R.id.title_container);
214         LinearLayout laySearchContainer = (LinearLayout) findViewById(R.id.search_container);
215         EditText edtSearchInput = (EditText) findViewById(R.id.search_input);
216
217         InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
218         if(show) {
219             layTitleContainer.setVisibility(View.GONE);
220             laySearchContainer.setVisibility(View.VISIBLE);
221             edtSearchInput.requestFocus();
222
223             imm.showSoftInput(edtSearchInput, InputMethodManager.SHOW_IMPLICIT);
224         } else {
225             layTitleContainer.setVisibility(View.VISIBLE);
226             laySearchContainer.setVisibility(View.GONE);
227
228             View view = this.getCurrentFocus();
229             if (view != null) {
230                 imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
231             }
232         }
233     }
234
235     private void triggerSearchAction(String query) {
236         Bundle bundle = new Bundle();
237         bundle.putString("query", query);
238
239         AppContext.getNavigationManager().navigatePage("AppSearch", bundle);
240     }
241
242     @Override
243     public void onBackPressed() {
244         DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
245         if (drawer.isDrawerOpen(GravityCompat.START)) {
246             drawer.closeDrawer(GravityCompat.START);
247         } else if(!AppContext.getNavigationManager().back()) {
248             super.onBackPressed(); // trigger system action if internal navigation manager returns false for back()
249         }
250     }
251
252     @Override
253     public boolean onCreateOptionsMenu(Menu menu) {
254         // Inflate the menu; this adds items to the action bar if it is present.
255         getMenuInflater().inflate(R.menu.campus_app, menu);
256         return true;
257     }
258
259     @Override
260     public boolean onOptionsItemSelected(MenuItem item) {
261         // Handle action bar item clicks here. The action bar will
262         // automatically handle clicks on the Home/Up button, so long
263         // as you specify a parent activity in AndroidManifest.xml.
264         int id = item.getItemId();
265
266         //noinspection SimplifiableIfStatement
267         if (id == R.id.action_settings) {
268             return true;
269         }
270
271         return super.onOptionsItemSelected(item);
272     }
273
274     /* nfc listener related callbacks */
275     @Override
276     public void onResume() {
277         super.onResume();
278         Log.i("CampusApp", "onResume event");
279         AppContext.getNfcCardListener().resumeForefrontDispatcher();
280     }
281
282     @Override
283     public void onPause() {
284         super.onPause();
285         Log.i("CampusApp", "Event: onPause");
286         AppContext.getNfcCardListener().pauseForefrontDispatcher();
287     }
288
289     @Override
290     public void onNewIntent(Intent intent) {
291         if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {
292             AppContext.getNfcCardListener().handleNfcEvent(intent);
293         }
294     }
295
296 }