dtu.ds.warnme.app.activity.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for dtu.ds.warnme.app.activity.MainActivity.java

Source

/**
 * Project:   warnme-app
 * File:      MainActivity.java
 * License: 
 *            This file is licensed under GNU General Public License version 3
 *            http://www.gnu.org/licenses/gpl-3.0.txt
 *
 * Copyright: Bartosz Cichecki [ cichecki.bartosz@gmail.com ]
 * Date:      Mar 23, 2014
 */

package dtu.ds.warnme.app.activity;

import org.apache.commons.collections4.queue.CircularFifoQueue;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.gson.reflect.TypeToken;

import dtu.ds.warnme.app.R;
import dtu.ds.warnme.app.application.Prefs;
import dtu.ds.warnme.app.dialog.LoginDialog;
import dtu.ds.warnme.app.dialog.RegisterDialog;
import dtu.ds.warnme.app.dialog.ReportDialog;
import dtu.ds.warnme.app.dialog.WarningDialog;
import dtu.ds.warnme.app.dialog.listener.LoginDialogListener;
import dtu.ds.warnme.app.dialog.listener.RegisterDialogListener;
import dtu.ds.warnme.app.dialog.listener.ReportDialogListener;
import dtu.ds.warnme.app.holders.UserProfileHolder;
import dtu.ds.warnme.app.location.FollowMeLocationSource;
import dtu.ds.warnme.app.location.FollowMeLocationSourceListener;
import dtu.ds.warnme.app.model.impl.Event;
import dtu.ds.warnme.app.model.impl.User;
import dtu.ds.warnme.app.ws.client.https.GsonHttpResponseHandler;
import dtu.ds.warnme.app.ws.client.restful.RestClientHolder;

/**
 * 
 * @author Bartosz Cichecki
 * 
 */
public class MainActivity extends Activity implements FollowMeLocationSourceListener, LoginDialogListener,
        RegisterDialogListener, ReportDialogListener {

    private static final String TAG = "MainActivity";

    public static final String KEY_CURRENT_LOCATION = "currentLocation";

    public static final String KEY_EVENT = "event";

    private GoogleMap map;

    private FollowMeLocationSource locationSource;

    private Button buttonReport;

    private MenuItem menuItemDesc;

    private MenuItem menuItemLogin;

    private MenuItem menuItemLogout;

    private MenuItem menuItemRegister;

    private WarningDialog warningDialog;

    private CircularFifoQueue<Event> alreadyWarned = new CircularFifoQueue<Event>(100);

    public Button getButtonReport() {
        return buttonReport;
    }

    public MenuItem getMenuItemDesc() {
        return menuItemDesc;
    }

    public MenuItem getMenuItemLogin() {
        return menuItemLogin;
    }

    public MenuItem getMenuItemLogout() {
        return menuItemLogout;
    }

    @Override
    public void onAbort() {
        buttonReport.setEnabled(true);
    }

    @Override
    public void onApproachingEvent(Event event) {
        if (warningDialog != null && event.equals(warningDialog.getEvent())) {
            return;
        }

        if (alreadyWarned.contains(event)) {
            return;
        }
        alreadyWarned.add(event);

        if (warningDialog != null) {
            warningDialog.dismiss();
        }

        FragmentTransaction ft = getFragmentManager().beginTransaction();
        Fragment prev = getFragmentManager().findFragmentByTag(LoginDialog.class.getName());
        if (prev != null) {
            ft.remove(prev);
        }
        ft.addToBackStack(null);

        Bundle args = new Bundle();
        args.putSerializable(KEY_EVENT, event);

        warningDialog = new WarningDialog();
        warningDialog.setEvent(event);
        warningDialog.setArguments(args);
        warningDialog.show(ft, WarningDialog.class.getName());
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        map.setMyLocationEnabled(true);
        map.getUiSettings().setAllGesturesEnabled(true);
        map.getUiSettings().setCompassEnabled(true);

        locationSource = new FollowMeLocationSource(this, getApplicationContext(), map);
        locationSource.getBestAvailableProvider();
        map.setLocationSource(locationSource);

        buttonReport = (Button) findViewById(R.id.button_report);
        buttonReport.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                buttonReport.setEnabled(false);

                FragmentTransaction ft = getFragmentManager().beginTransaction();
                Fragment prev = getFragmentManager().findFragmentByTag(ReportDialog.class.getName());
                if (prev != null) {
                    ft.remove(prev);
                }
                ft.addToBackStack(null);

                Bundle args = new Bundle();
                args.putParcelable(KEY_CURRENT_LOCATION, locationSource.getCurrentLocation());

                ReportDialog reportDialog = new ReportDialog();
                reportDialog.setArguments(args);
                reportDialog.show(ft, ReportDialog.class.getName());
            }
        });

        verifyLogin();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);

        menuItemDesc = menu.findItem(R.id.action_desc);
        menuItemLogin = menu.findItem(R.id.action_login);
        menuItemRegister = menu.findItem(R.id.action_register);
        menuItemLogout = menu.findItem(R.id.action_logout);

        updateUserInterface();

        return true;
    }

    @Override
    public void onCredentialsExpired() {
        updateUserInterface();

        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        dialogBuilder.setIcon(android.R.drawable.ic_dialog_alert).setTitle(R.string.credentials_expired)
                .setMessage(R.string.credentials_expired_desc)
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // Nothing to do here...
                    }
                });
        dialogBuilder.show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        RestClientHolder.getRestClient().cancelRequests(this, true);
    }

    @Override
    public void onDownloadEventsFailed() {
        Toast.makeText(this, R.string.failed_to_update_events, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDownloadEventsSuccessful() {
        Toast.makeText(this, R.string.new_events_downloaded, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onLoginFailure() {
        updateUserInterface();
    }

    @Override
    public void onLoginSuccess() {
        updateUserInterface();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_login) {
            Log.d(TAG, "Showing login dialog...");

            FragmentTransaction ft = getFragmentManager().beginTransaction();
            Fragment prev = getFragmentManager().findFragmentByTag(LoginDialog.class.getName());
            if (prev != null) {
                ft.remove(prev);
            }
            ft.addToBackStack(null);

            LoginDialog ld = new LoginDialog();
            ld.show(ft, LoginDialog.class.getName());
            return true;
        }
        if (id == R.id.action_register) {
            Log.d(TAG, "Showing register dialog...");

            FragmentTransaction ft = getFragmentManager().beginTransaction();
            Fragment prev = getFragmentManager().findFragmentByTag(RegisterDialog.class.getName());
            if (prev != null) {
                ft.remove(prev);
            }
            ft.addToBackStack(null);

            RegisterDialog rd = new RegisterDialog();
            rd.show(ft, RegisterDialog.class.getName());
            return true;
        }
        if (id == R.id.action_logout) {
            Log.d(TAG, "Logging out...");

            UserProfileHolder.clear();
            Prefs.setUsername(StringUtils.EMPTY);
            Prefs.setPasswordHash(StringUtils.EMPTY);

            updateUserInterface();
            return true;
        }
        if (id == R.id.action_settings) {
            Log.d(TAG, "Moving to Settings activity...");

            Intent settingsActivityIntent = new Intent(this, SettingsActivity.class);
            startActivity(settingsActivityIntent);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onRegisterFailure() {
        // Nothing to do here...
    }

    @Override
    public void onRegisterSuccess() {
        Toast.makeText(this, R.string.registration_successful, Toast.LENGTH_LONG).show();
    }

    @Override
    public void onReportFailed() {
        buttonReport.setEnabled(true);
    }

    @Override
    public void onReportSuccessful() {
        buttonReport.setEnabled(true);
        Toast.makeText(this, R.string.report_success, Toast.LENGTH_SHORT).show();
    }

    private void updateUserInterface() {
        Log.d(TAG, "Updating user interface. [loggedIn=" + UserProfileHolder.isLoggedIn() + "]");

        boolean loggedIn = UserProfileHolder.isLoggedIn();

        if (menuItemDesc != null) {
            menuItemDesc.setTitle(
                    UserProfileHolder.getUserProfile() != null ? UserProfileHolder.getUserProfile().getUsername()
                            : "");
        }
        if (menuItemLogin != null) {
            menuItemLogin.setVisible(!loggedIn);
        }
        if (menuItemRegister != null) {
            menuItemRegister.setVisible(!loggedIn);
        }
        if (menuItemDesc != null) {
            menuItemDesc.setVisible(loggedIn);
        }
        if (menuItemLogout != null) {
            menuItemLogout.setVisible(loggedIn);
        }
        if (buttonReport != null) {
            buttonReport.setVisibility(loggedIn ? View.VISIBLE : View.GONE);
        }
    }

    private void verifyLogin() {
        // First let's check if user provided any credentials
        if (Prefs.isCredentialsProvided()) {
            Log.i(TAG, "Verifying stored credentials.");

            // So if user provided some details, let's check if they are correct
            RestClientHolder.getRestClient().getProfile(this,
                    new GsonHttpResponseHandler<User>(new TypeToken<User>() {
                    }.getType()) {

                        @Override
                        public void onFailure(int statusCode, Header[] headers, String responseBody,
                                Throwable error) {
                            Log.e(TAG, "Login failed. [statusCode = " + statusCode + ", error=" + error + "]");
                            // It seems that details are not correct. Let's disable some UI again.
                            updateUserInterface();
                        }

                        @Override
                        public void onFinish() {
                            Log.v(TAG, "Automatic login finished.");
                        }

                        @Override
                        public void onStart() {
                            Log.i(TAG, "Starting automatic login...");
                        }

                        @Override
                        public void onSuccess(int statusCode, Header[] headers, User user) {
                            Log.i(TAG, "Login succeeded. [statusCode=" + statusCode + ", username="
                                    + user.getUsername() + "]");
                            // It seems that details that were provided are correct... Let's store the profile and again tweak the UI.
                            UserProfileHolder.setUserProfile(user);
                            updateUserInterface();
                        }
                    });

        } else {
            Log.i(TAG, "No credentials stored.");
            // If there are no credentials given let's disable some UI...
            updateUserInterface();
        }
    }

}