1 package de.dhbwloe.campusapp;
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;
28 import java.util.Date;
30 import de.dhbwloe.campusapp.nfcreader.NfcCardListener;
32 public class CampusApp extends FragmentActivity {
34 private boolean bSearchActive = false;
35 private CampusAppContext AppContext = null;
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.
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.
46 * AppContext.getNavigationManager() NavigationManager Verwaltet die angezeigten Fragmente und deren Navigation
47 * .navigatePage("Dashboard") to navigate to the Dashboard
48 * ... to be continued ...
52 protected void onCreate(Bundle savedInstanceState) {
53 Log.i("CampusApp", "Event: onCreate");
54 super.onCreate(savedInstanceState);
55 setContentView(R.layout.activity_campus_app);
57 AppContext = CampusAppContext.getInstance();
58 if(AppContext == null)
59 AppContext = new CampusAppContext(this, R.id.fragment_container);
61 AppContext.setMainActivity(this);
63 boolean instantRestore = false;
64 if(savedInstanceState != null) {
65 long lastrun = savedInstanceState.getLong("lastrun");
66 lastrun = ((new Date()).getTime()/1000) - lastrun;
67 Log.i("CampusApp", "Restored from Idle state! Idled: "+lastrun+" secs");
69 instantRestore = true;
71 AppContext.setTitle(savedInstanceState.getString("activetitle"));
75 Bundle contextVars = savedInstanceState.getBundle("savedContextVariables");
76 if(contextVars != null) {
77 Bundle contextVariables = AppContext.getContextVariables();
78 contextVariables.putAll(contextVars);
83 if(instantRestore) // orientation change
86 // don't add navigation to SlashScreen, or even from SplashScreen to Dashboard to the history log!
87 // it would be very strange to return to the SplashScreen or an "empty" page on return ;)
88 AppContext.getNavigationManager().navigatePage("SplashScreen", null, false);
93 public void onSaveInstanceState(Bundle savedInstanceState) {
94 Log.i("CampusApp", "Event: onSaveInstanceState");
95 // Save instance state during "restarts" due to orientation changes.
96 // We don't want to see the splash screen everytime the orientation changes ;)
97 savedInstanceState.putLong("lastrun", (new Date()).getTime() / 1000);
98 savedInstanceState.putString("activepage", AppContext.getNavigationManager().getCurrentPageName());
99 TextView titleView = (TextView) findViewById(R.id.title);
100 savedInstanceState.putString("activetitle", titleView.getText().toString());
102 Bundle contextVariables = AppContext.getContextVariables();
103 savedInstanceState.putBundle("savedContextVariables", contextVariables);
105 // Always call the superclass so it can save the view hierarchy state
106 super.onSaveInstanceState(savedInstanceState);
108 AppContext = null; // simulate GC
111 public void prepareMainUi() {
112 ImageView btnOpenSearch = (ImageView) findViewById(R.id.search_button);
113 btnOpenSearch.setVisibility(View.GONE);
116 public void loadMainUi() {
117 ImageView btnOpenSearch = (ImageView) findViewById(R.id.search_button);
119 btnOpenSearch.setVisibility(View.VISIBLE);
121 setupSearchTriggers();
123 AppContext.getNfcCardListener().startNfcListener();
126 private void setupActionBar() {
127 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
128 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
129 ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
130 drawer.setDrawerListener(toggle);
133 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
134 navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
135 @SuppressWarnings("StatementWithEmptyBody")
137 public boolean onNavigationItemSelected(MenuItem item) {
138 // Handle navigation view item clicks here.
139 int id = item.getItemId();
141 switch (id) { // Navigation Items from res/menu/activity_campus_app_drawer.xml
142 case R.id.nav_dashboard:
143 AppContext.getNavigationManager().navigatePage("Dashboard");
145 case R.id.nav_vorlesungsplan:
146 AppContext.getNavigationManager().navigatePage("Vorlesungsplan");
149 AppContext.getNavigationManager().navigatePage("Mensa");
152 AppContext.getNavigationManager().navigatePage("News");
154 case R.id.nav_settings:
155 Intent settings = new Intent(AppContext.getMainActivity(), SettingsActivity.class);
156 AppContext.getMainActivity().startActivity(settings);
158 case R.id.nav_impressum:
159 AppContext.getNavigationManager().navigatePage("Impressum");
165 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
166 drawer.closeDrawer(GravityCompat.START);
172 private void setupSearchTriggers() {
173 ImageView btnOpenSearch = (ImageView) findViewById(R.id.search_button);
174 ImageView btnCloseSearch = (ImageView) findViewById(R.id.search_clear);
175 EditText edtSearchInput = (EditText) findViewById(R.id.search_input);
176 TextView txtTitle = (TextView) findViewById(R.id.title);
178 btnOpenSearch.setOnClickListener(new View.OnClickListener() {
180 public void onClick(View view) {
181 triggerSearchPanel(true);
184 edtSearchInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
186 public void onFocusChange(View v, boolean hasFocus) {
187 EditText edtSearchInput = (EditText) v;
188 if (!hasFocus && edtSearchInput.getText().length() == 0) {
189 triggerSearchPanel(false);
193 edtSearchInput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
195 public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
196 if (actionId == EditorInfo.IME_ACTION_SEARCH) {
197 EditText edtSearchInput = (EditText) v;
198 triggerSearchAction(edtSearchInput.getText().toString());
199 triggerSearchPanel(false);
205 btnCloseSearch.setOnClickListener(new View.OnClickListener() {
207 public void onClick(View view) {
208 EditText edtSearchInput = (EditText) findViewById(R.id.search_input);
209 edtSearchInput.setText("");
210 triggerSearchPanel(false);
213 txtTitle.setOnClickListener(new View.OnClickListener() {
215 public void onClick(View view) {
216 triggerSearchPanel(true);
222 private void triggerSearchPanel(boolean show) {
223 if(bSearchActive == show)
225 bSearchActive = show;
226 LinearLayout layTitleContainer = (LinearLayout) findViewById(R.id.title_container);
227 LinearLayout laySearchContainer = (LinearLayout) findViewById(R.id.search_container);
228 EditText edtSearchInput = (EditText) findViewById(R.id.search_input);
230 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
232 layTitleContainer.setVisibility(View.GONE);
233 laySearchContainer.setVisibility(View.VISIBLE);
234 edtSearchInput.requestFocus();
236 imm.showSoftInput(edtSearchInput, InputMethodManager.SHOW_IMPLICIT);
238 layTitleContainer.setVisibility(View.VISIBLE);
239 laySearchContainer.setVisibility(View.GONE);
241 View view = this.getCurrentFocus();
243 imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
248 private void triggerSearchAction(String query) {
249 Bundle bundle = new Bundle();
250 bundle.putString("query", query);
252 AppContext.getNavigationManager().navigatePage("AppSearch", bundle);
256 public void onBackPressed() {
257 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
258 if (drawer.isDrawerOpen(GravityCompat.START)) {
259 drawer.closeDrawer(GravityCompat.START);
260 } else if(!AppContext.getNavigationManager().back()) {
261 super.onBackPressed(); // trigger system action if internal navigation manager returns false for back()
266 public boolean onCreateOptionsMenu(Menu menu) {
267 // Inflate the menu; this adds items to the action bar if it is present.
268 getMenuInflater().inflate(R.menu.campus_app, menu);
273 public boolean onOptionsItemSelected(MenuItem item) {
274 // Handle action bar item clicks here. The action bar will
275 // automatically handle clicks on the Home/Up button, so long
276 // as you specify a parent activity in AndroidManifest.xml.
277 int id = item.getItemId();
279 //noinspection SimplifiableIfStatement
280 if (id == R.id.action_settings) {
284 return super.onOptionsItemSelected(item);
287 /* nfc listener related callbacks */
289 public void onResume() {
290 if(AppContext == null)
291 AppContext = new CampusAppContext(this, R.id.fragment_container);
293 AppContext.setMainActivity(this);
296 Log.i("CampusApp", "onResume event");
297 AppContext.getNfcCardListener().resumeForefrontDispatcher();
301 public void onPause() {
303 Log.i("CampusApp", "Event: onPause");
304 AppContext.getNfcCardListener().pauseForefrontDispatcher();
308 public void onNewIntent(Intent intent) {
309 if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {
310 AppContext.getNfcCardListener().handleNfcEvent(intent);