org.sigimera.app.android.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.sigimera.app.android.MainActivity.java

Source

/**
 * Sigimera Crises Information Platform Android Client
 * Copyright (C) 2013 by Sigimera
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
package org.sigimera.app.android;

import org.sigimera.app.android.backend.network.LocationUpdaterHttpHelper;
import org.sigimera.app.android.controller.ApplicationController;
import org.sigimera.app.android.controller.LocationController;
import org.sigimera.app.android.controller.PersistanceController;
import org.sigimera.app.android.exception.AuthenticationErrorException;
import org.sigimera.app.android.model.Constants;
import org.sigimera.app.android.util.Common;
import org.sigimera.app.android.util.Config;

import com.google.android.gcm.GCMRegistrar;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.location.Location;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.webkit.WebView;
import android.widget.EditText;
import android.widget.TabHost;
import android.widget.Toast;

/**
 * Activity which initialise the tabs and starts the application.
 *
 * @author Corneliu-Valentin Stanciu
 * @e-mail corneliu.stanciu@sigimera.org
 */
public class MainActivity extends FragmentActivity {

    /**
     * Authentication token.
     */
    private String authToken;

    /**
     * Hosting the tabs.
     */
    private TabHost mTabHost;

    /**
     * View pager used for scrolling to the left and right.
     */
    private ViewPager mViewPager;

    /**
     * The main container of tabs and view pager.
     */
    private TabsAdapter mTabsAdapter;

    /**
     * Progress dialog for waiting while loading.
     */
    private ProgressDialog progressDialog = null;

    /**
     *
     */
    private final Handler guiHandler = new Handler();

    /**
     * Thread which calls the login error method.
     */
    private final Runnable errorLogin = new Runnable() {
        @Override
        public void run() {
            showLoginErrorToast();
        }
    };

    /**
     * Thread which calls the method for setting the tabs if the login was
     * successfully or there exists an authentication token.
     */
    private final Runnable successfulLogin = new Runnable() {
        @Override
        public void run() {
            setTabsAfterLogin();
        }
    };

    @Override
    protected final void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_main);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        ApplicationController appController = ApplicationController.getInstance();

        int currentapiVersion = Build.VERSION.SDK_INT;
        if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) {
            appController.init(getApplicationContext(), getSharedPreferences(Constants.PREFS_NAME, 0),
                    getActionBar());
            if (!Common.hasInternet()) {
                getActionBar().setIcon(getResources().getDrawable(R.drawable.sigimera_logo_offline));
            }
        } else {
            appController.init(getApplicationContext(), getSharedPreferences(Constants.PREFS_NAME, 0), null);
        }

        // Initialize the tabs
        initTabs();

        if (savedInstanceState != null) {
            mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
        }
    }

    /**
     * Initialise Google Cloud Messaging.
     */
    private void initGCM() {
        if (Config.getInstance().getGcmProjectId() != null) {
            try {
                GCMRegistrar.checkDevice(this);
                GCMRegistrar.checkManifest(this);
                final String regId = GCMRegistrar.getRegistrationId(this);
                if (regId.equals("")) {
                    GCMRegistrar.register(this, Config.getInstance().getGcmProjectId());
                }
            } catch (Exception e) {
                Log.v(Constants.LOG_TAG_SIGIMERA_APP, "Device meets not the GCM requirements. Exception: " + e);
            }
        }
    }

    /**
     * Initialise of tabs.
     */
    private void initTabs() {
        mTabHost = (TabHost) findViewById(android.R.id.tabhost);
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mTabHost.setup();

        try {
            authToken = ApplicationController.getInstance().getSessionHandler().getAuthenticationToken();

            setTabsAfterLogin();
        } catch (AuthenticationErrorException e) {
            setTabsBeforeLogin();
        }
    }

    @Override
    protected final void onSaveInstanceState(final Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("tab", mTabHost.getCurrentTabTag());
    }

    @Override
    public final boolean onCreateOptionsMenu(final Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        MenuItem itemUpdateLocation = menu.findItem(R.id.menu_update_location);
        itemUpdateLocation.setTitle("Update your location");

        MenuItem itemUpdateEverything = menu.findItem(R.id.menu_update_everything);
        itemUpdateEverything.setTitle("Update everything");
        return super.onCreateOptionsMenu(menu);
    }

    /**
     * Login Listener defined in login.xml layout.
     *
     * @param view
     *            - Android internal needs.
     * @see http://developer.android.com/reference
     *      /android/view/View.html#attr_android:onClickandroid:onClick
     */
    public final void loginClicked(final View view) {
        progressDialog = ProgressDialog.show(MainActivity.this, null, "Authentication in progress...", false);
        Thread worker = new Thread() {
            @Override
            public void run() {
                Looper.prepare();

                EditText emailView = (EditText) findViewById(R.id.email_input_field);
                EditText passwordView = (EditText) findViewById(R.id.password_input_field);

                if (ApplicationController.getInstance().getSessionHandler().login(emailView.getText().toString(),
                        passwordView.getText().toString())) {

                    guiHandler.post(successfulLogin);
                } else {
                    guiHandler.post(errorLogin);
                }
            }
        };
        worker.start();
    }

    /**
     * The click listener defined in statistic_fragment.xml.
     *
     * @param view
     *            - Android internal needs.
     * @see http://developer.android.com/reference
     *      /android/view/View.html#attr_android:onClickandroid:onClick
     */
    public final void allCrisesClicked(final View view) {
        if (mViewPager != null) {
            mViewPager.setCurrentItem(1, true);
        }
    }

    /**
     * Create account listener in login.xml layout.
     *
     * @param view
     *            - Android internal needs
     * @see http://developer.android.com/reference
     *      /android/view/View.html#attr_android:onClickandroid:onClick
     */
    public final void accountClicked(final View view) {
        Uri uri = Uri.parse("https://www.sigimera.org/register");
        startActivity(new Intent(Intent.ACTION_VIEW, uri));
    }

    @Override
    public final boolean onOptionsItemSelected(final MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_update_location:
            LocationUpdaterHttpHelper locUpdater = new LocationUpdaterHttpHelper();
            Location loc = LocationController.getInstance().getLastKnownLocation();
            if (loc != null) {
                Toast toast = Toast.makeText(getApplicationContext(), "Trying to update your current location...",
                        Toast.LENGTH_LONG);
                toast.setGravity(Gravity.TOP, 0, 0);
                toast.show();
                String latitude = loc.getLatitude() + "";
                String longitude = loc.getLongitude() + "";
                authToken = ApplicationController.getInstance().getSharedPreferences().getString("auth_token",
                        null);
                if (authToken != null) {
                    locUpdater.execute(authToken, latitude, longitude);
                }
            } else {
                Toast toast = Toast.makeText(getApplicationContext(),
                        "Not able to update location! " + "Please active location access...", Toast.LENGTH_LONG);
                toast.setGravity(Gravity.TOP, 0, 0);
                toast.show();
            }
            return true;
        case R.id.menu_update_everything:
            try {
                PersistanceController.getInstance().updateEverything(authToken);
            } catch (InterruptedException e) {
                Log.e("[MAIN ACTIVITY]", "The thread coudn't sleep betheen api calls.");
            }
            return true;
        case R.id.menu_logout:
            ApplicationController.getInstance().getSessionHandler().logout();
            setTabsBeforeLogin();
            return true;
        case R.id.menu_unregister:
            GCMRegistrar.unregister(getApplicationContext());
            return true;
        case R.id.about:
            showAboutDialog();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    /**
     * Close the progress dialog.
     */
    public final void closeProgressDialog() {
        if (progressDialog != null) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }

    /**
     * Shows the about dialog.
     */
    public final void showAboutDialog() {
        AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).create();
        dialog.setTitle("About");
        dialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(final DialogInterface dialog, final int which) {
                dialog.cancel();
            }
        });

        WebView wv = new WebView(this);
        wv.setBackgroundColor(Color.BLACK);

        StringBuffer strbuffer = new StringBuffer();
        strbuffer.append("<small><font color='white'>");
        strbuffer.append("<h3 style='text-align: center'>" + this.getString(R.string.app_name) + "</h3>");

        strbuffer.append("<p>This is the official App of the Crises "
                + "Information Platform Sigimera. It provides " + "the following functionality:</p>");
        strbuffer.append("<ul>");
        strbuffer.append("<li>Get crises (natural disaster) information."
                + "Currently floods, earthquakes, cyclones " + "and volcanic erruptions.</li>");
        strbuffer.append("<li>Get crises alerts via push notifications.</li>");
        strbuffer.append("<li>Get new crises via push notifications.</li>");
        strbuffer.append("<li>Manage your App via " + "<a href='http://www.sigimera.org/mobile_devices'>"
                + "<span style='color: #00FFFF'>mobile device management" + "website </span></a>.");
        strbuffer.append("</ul>");
        strbuffer.append("<p>&copy; 2013 <a href='http://www.sigimera.com'>"
                + "<span style='color: #00FFFF'>Sigimera Ltd.</span></a>. " + "All rights reserved.</p>");

        wv.loadData(strbuffer.toString(), "text/html", "utf-8");

        dialog.setView(wv);
        dialog.show();
    }

    /**
     * Shows the error toast message if the login failed.
     */
    public final void showLoginErrorToast() {
        new ToastNotification(getApplicationContext(), "Email or password are incorrect!", Toast.LENGTH_SHORT);
        closeProgressDialog();
    }

    /**
     * Set the order of tabs if the login was successfully or there exists a
     * authentication token.
     */
    private void setTabsAfterLogin() {
        this.mTabHost.clearAllTabs();
        this.mTabsAdapter = new TabsAdapter(this, this.mTabHost, this.mViewPager);

        this.mTabsAdapter.addTab(this.mTabHost.newTabSpec("Home").setIndicator("Home"), StatisticFragment.class,
                null);
        this.mTabsAdapter.addTab(this.mTabHost.newTabSpec("Crises").setIndicator("Crises"),
                CrisesListFragment.class, null);
        this.mTabsAdapter.addTab(mTabHost.newTabSpec("Profile").setIndicator("Profile"), ProfileFragment.class,
                null);
        initGCM();
        closeProgressDialog();
    }

    /**
     * Set the order of tabs if there is no authentication token.
     */
    private void setTabsBeforeLogin() {
        this.mTabHost.clearAllTabs();
        this.mTabsAdapter = new TabsAdapter(this, this.mTabHost, this.mViewPager);
        mTabsAdapter.addTab(mTabHost.newTabSpec("login").setIndicator("Login"), LoginFragment.class, null);
        mTabsAdapter.addTab(mTabHost.newTabSpec("Crises").setIndicator("Crises"), CrisesListFragment.class, null);
        closeProgressDialog();
    }
}