edu.hastings.hastingscollege.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for edu.hastings.hastingscollege.MainActivity.java

Source

package edu.hastings.hastingscollege;

/*
 * Copyright 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;

import org.xmlpull.v1.XmlPullParserException;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import edu.hastings.hastingscollege.connection.Connection;
import edu.hastings.hastingscollege.googleanalytics.MyApplication;
import edu.hastings.hastingscollege.model.Data;
import edu.hastings.hastingscollege.navdrawerfragments.FragmentAbout;
import edu.hastings.hastingscollege.navdrawerfragments.FragmentAthletics;
import edu.hastings.hastingscollege.navdrawerfragments.FragmentBroncoboard;
import edu.hastings.hastingscollege.navdrawerfragments.FragmentCampusEvents;
import edu.hastings.hastingscollege.navdrawerfragments.FragmentDiningHall;
import edu.hastings.hastingscollege.navdrawerfragments.FragmentEmergencyContacts;
import edu.hastings.hastingscollege.navdrawerfragments.FragmentHome;
import edu.hastings.hastingscollege.navdrawerfragments.FragmentMap;
import edu.hastings.hastingscollege.navdrawerfragments.FragmentTwitter;

public class MainActivity extends FragmentActivity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    // nav drawer title
    private CharSequence mDrawerTitle;
    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;

    private int mFragPosition = 0;

    private boolean mConnection;
    public static boolean mShouldNotify = true;
    public Tracker tracker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Checks whether the user set the preference to include summary text
        //SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
        //mShouldNotify = sharedPrefs.getBoolean("notificationsPref", false);

        mConnection = new Connection().hasConnection(MainActivity.this);

        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.drawer_items);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        // set a custom shadow that overlays the main content when the drawer opens
        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        mDrawerList.setAdapter(new ArrayAdapter<>(this, R.layout.drawer_list_item, navMenuTitles));

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // enable ActionBar app icon to behave as action to toggle nav drawer
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        // ActionBarDrawerToggle ties together the the proper interactions
        // between the sliding drawer and the action bar app icon
        mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
                mDrawerLayout, /* DrawerLayout object */
                R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
                R.string.drawer_open, /* "open drawer" description for accessibility */
                R.string.drawer_close /* "close drawer" description for accessibility */
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            selectItem(0);
        }
        new DownloadXmlTask().execute(getString(R.string.sodexo_menu_url));

        tracker = ((MyApplication) getApplication()).getTracker(MyApplication.TrackerName.APP_TRACKER);
        tracker.setScreenName("App Opened");
        tracker.send(new HitBuilders.AppViewBuilder().build());
    }

    @Override
    public void finish() {
        Data.mondayMenu = null;
        Data.tuesdayMenu = null;
        Data.wednesdayMenu = null;
        Data.thursdayMenu = null;
        Data.fridayMenu = null;
        Data.saturdayMenu = null;
        Data.sundayMenu = null;
        Data.dates = null;
        super.finish();
        //overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    //Fires after the OnStop() state
    @Override
    protected void onDestroy() {
        super.onDestroy();
        try {
            trimCache(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void trimCache(Context context) {
        try {
            File dir = context.getCacheDir();
            if (dir != null && dir.isDirectory()) {
                deleteDir(dir);
            }
        } catch (Exception e) {
            Log.v("Trim Cache exception", e.toString());
        }
    }

    public static boolean deleteDir(File dir) {
        if (dir != null && dir.isDirectory()) {
            String[] children = dir.list();
            for (String aChildren : children) {
                boolean success = deleteDir(new File(dir, aChildren));
                if (!success) {
                    return false;
                }
            }
        }

        // The directory is now empty so delete it
        return dir.delete();
    }

    private class SlideMenuClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // display view for selected nav drawer item
            selectItem(position);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    /* Called whenever we call invalidateOptionsMenu() */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the nav drawer is open, hide action items related to the content view
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        boolean fragmentRefreshable = ((mFragPosition != 7) && (mFragPosition != 8));
        //menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
        menu.findItem(R.id.itemRefresh).setVisible(!drawerOpen && fragmentRefreshable);
        menu.findItem(R.id.settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // toggle nav drawer on selecting action bar app icon/title
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action bar actions click
        switch (item.getItemId()) {
        case R.id.itemRefresh:
            if (mFragPosition == 2)
                new DownloadXmlTask().execute(getString(R.string.sodexo_menu_url));
            selectItem(mFragPosition);
            return true;
        case R.id.settings:
            Intent settingsActivity = new Intent(getBaseContext(), SettingsActivity.class);
            startActivity(settingsActivity);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    private void selectItem(int position) {
        // update the main content frame by replacing fragments
        Fragment fragment = null;
        mFragPosition = position;
        // Fragments requiriing connection
        switch (position) {
        case 0:
            if (mConnection) {
                fragment = new FragmentHome();

            } else {
                buildDialog(this).show();
            }
            break;
        case 1:
            fragment = new FragmentMap();
            break;
        case 2:
            if (mConnection) {
                fragment = new FragmentDiningHall();
            } else {
                buildDialog(this).show();
            }
            break;
        case 3:
            if (mConnection) {
                fragment = new FragmentBroncoboard();
            } else {
                buildDialog(this).show();
            }
            break;
        case 4:
            if (mConnection) {
                fragment = new FragmentTwitter();
            } else {
                buildDialog(this).show();
            }
            break;
        case 5:
            if (mConnection) {
                fragment = new FragmentCampusEvents();
            } else {
                buildDialog(this).show();
            }
            break;
        case 6:
            if (mConnection) {
                fragment = new FragmentAthletics();
            } else {
                buildDialog(this).show();
            }
            break;
        case 7:
            fragment = new FragmentEmergencyContacts();
            break;
        case 8:
            fragment = new FragmentAbout();
        default:
            break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }

    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    public AlertDialog.Builder buildDialog(Context c) {

        AlertDialog.Builder builder = new AlertDialog.Builder(c);
        builder.setTitle("No Internet connection.");
        builder.setMessage("Check your Internet Connection");

        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                //finish();
            }
        });
        return builder;
    }

    // Given a string representation of a URL, sets up a connection and gets
    // an input stream.
    private InputStream downloadUrl(String urlString) throws IOException {
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        return conn.getInputStream();
    }

    //Displays an error if the app is unable to load content.
    private void showSodexoError() {
        // The specified network connection is not available. Displays error message.
        Toast.makeText(this, "Unable to load feed, Check your internet connection", Toast.LENGTH_LONG).show();
    }

    // Implementation of AsyncTask used to download XML feed
    private class DownloadXmlTask extends AsyncTask<String, Void, List<HashMap<String, String>>> {

        @Override
        protected List<HashMap<String, String>> doInBackground(String... urls) {
            InputStream stream = null;
            SodexoXmlParser sodexoXmlParser = new SodexoXmlParser(MainActivity.this);
            List<HashMap<String, String>> menuItems = new ArrayList<>();
            try {
                try {
                    stream = downloadUrl(urls[0]);
                    menuItems = sodexoXmlParser.parse(stream);
                } finally {
                    if (stream != null) {
                        stream.close();
                    }
                }
            } catch (IOException e) {
                Log.d("IOException", e.toString());
            } catch (XmlPullParserException e) {
                Log.d("XmlPullParserException", e.toString());
            }

            return menuItems;
        }

        @Override
        protected void onPostExecute(List<HashMap<String, String>> menuItems) {
            super.onPostExecute(menuItems);
            if (menuItems != null) {
                retrieveItems(menuItems);
            } else
                showSodexoError();
        }

        protected void retrieveItems(List<HashMap<String, String>> menuItems) {
            final String KEY_ITEM_DATE = "menudate";
            final String KEY_DAY = "dayname";

            List<HashMap<String, String>> sundayMenu = new ArrayList<>();
            List<HashMap<String, String>> mondayMenu = new ArrayList<>();
            List<HashMap<String, String>> tuesdayMenu = new ArrayList<>();
            List<HashMap<String, String>> wednesdayMenu = new ArrayList<>();
            List<HashMap<String, String>> thursdayMenu = new ArrayList<>();
            List<HashMap<String, String>> fridayMenu = new ArrayList<>();
            List<HashMap<String, String>> saturdayMenu = new ArrayList<>();
            String[] dates = new String[7];

            for (HashMap<String, String> menuItem : menuItems) {
                if (menuItem.get(KEY_DAY).equals("Monday")) {
                    mondayMenu.add(menuItem);
                    dates[0] = menuItem.get(KEY_ITEM_DATE);
                } else if (menuItem.get(KEY_DAY).equals("Tuesday")) {
                    tuesdayMenu.add(menuItem);
                    dates[1] = menuItem.get(KEY_ITEM_DATE);
                } else if (menuItem.get(KEY_DAY).equals("Wednesday")) {
                    wednesdayMenu.add(menuItem);
                    dates[2] = menuItem.get(KEY_ITEM_DATE);
                } else if (menuItem.get(KEY_DAY).equals("Thursday")) {
                    thursdayMenu.add(menuItem);
                    dates[3] = menuItem.get(KEY_ITEM_DATE);
                } else if (menuItem.get(KEY_DAY).equals("Friday")) {
                    fridayMenu.add(menuItem);
                    dates[4] = menuItem.get(KEY_ITEM_DATE);
                } else if (menuItem.get(KEY_DAY).equals("Saturday")) {
                    saturdayMenu.add(menuItem);
                    dates[5] = menuItem.get(KEY_ITEM_DATE);
                } else if (menuItem.get(KEY_DAY).equals("Sunday")) {
                    sundayMenu.add(menuItem);
                    dates[6] = menuItem.get(KEY_ITEM_DATE);
                }
            }

            Data.mondayMenu = mondayMenu;
            Data.tuesdayMenu = tuesdayMenu;
            Data.wednesdayMenu = wednesdayMenu;
            Data.thursdayMenu = thursdayMenu;
            Data.fridayMenu = fridayMenu;
            Data.saturdayMenu = saturdayMenu;
            Data.sundayMenu = sundayMenu;
            Data.dates = dates;
        }
    }
}