org.thomasamsler.android.flashcards.activity.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.thomasamsler.android.flashcards.activity.MainActivity.java

Source

/*
 * Copyright 2011, 2012 Thomas Amsler
 *
 * 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. 
 */

package org.thomasamsler.android.flashcards.activity;

import org.thomasamsler.android.flashcards.ActionBusListener;
import org.thomasamsler.android.flashcards.AppConstants;
import org.thomasamsler.android.flashcards.MainApplication;
import org.thomasamsler.android.flashcards.R;
import org.thomasamsler.android.flashcards.conversion.FileToDbConversion;
import org.thomasamsler.android.flashcards.db.DataSource;
import org.thomasamsler.android.flashcards.dialog.HelpDialog;
import org.thomasamsler.android.flashcards.fragment.AboutFragment;
import org.thomasamsler.android.flashcards.fragment.ActionbarFragment;
import org.thomasamsler.android.flashcards.fragment.AddCardFragment;
import org.thomasamsler.android.flashcards.fragment.CardSetsFragment;
import org.thomasamsler.android.flashcards.fragment.SetupFragment;
import org.thomasamsler.android.flashcards.model.CardSet;
import org.thomasamsler.android.flashcards.pager.CardsPager;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.view.KeyEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends FragmentActivity implements ActionBusListener, AppConstants {

    private static final String FEEDBACK_EMAIL_ADDRESS = "tamsler@gmail.com";

    private ActionbarFragment mActionbarFragment;
    private CardSetsFragment mCardSetsFragment;
    private AddCardFragment mAddCardFragment;
    private SetupFragment mSetupFragment;
    private AboutFragment mAboutFragment;
    private CardsPager mCardsPager;
    private CardSet mCurrentCardSet;
    private int mHelpContext;
    private DataSource mDataSource;
    private int mActiveFragmentReference;

    private LinearLayout mFragmentContainer;
    private ViewPager mViewPager;

    private MainApplication mMainApplication;

    private boolean mExitOnBackPressed;

    private int mFontSize;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        mDataSource = new DataSource(this);
        mDataSource.open();

        mMainApplication = (MainApplication) getApplication();

        mMainApplication.initActionBusListener();

        mMainApplication.registerAction(this, ACTION_SHOW_CARD_SETS, ACTION_SHOW_CARDS, ACTION_SHOW_HELP,
                ACTION_SHOW_SETUP, ACTION_SHOW_ABOUT, ACTION_GET_EXTERNAL_CARD_SETS, ACTION_SET_HELP_CONTEXT,
                ACTION_SHOW_ADD_CARD, ACTION_ADD_CARD_SET, ACTION_FONT_SIZE_CHANGE, ACTION_SEND_FEEDBACK,
                ACTION_RESHUFFLE_CARDS);

        /*
         * Determine if we need to run the File to DB conversion
         */
        SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        boolean runConversion = sharedPreferences.getBoolean(PREFERENCE_RUN_CONVERSION,
                PREFERENCE_RUN_CONVERSION_DEFAULT);

        if (runConversion) {

            FileToDbConversion conversion = new FileToDbConversion();
            conversion.convert(this, mDataSource);

            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putBoolean(PREFERENCE_RUN_CONVERSION, false);
            editor.commit();
        }

        /*
         * Getting the preferred font size
         */
        int fontSizePreference = sharedPreferences.getInt(PREFERENCE_FONT_SIZE, PREFERENCE_NORMAL_FONT_SIZE);
        mFontSize = getFontSizePreference(fontSizePreference);

        mFragmentContainer = (LinearLayout) findViewById(R.id.fragmentContainer);
        mViewPager = (ViewPager) findViewById(R.id.viewpager);

        showCardSetsFragment(false);
    }

    @Override
    protected void onResume() {

        mDataSource.open();
        super.onResume();
    }

    @Override
    protected void onPause() {

        mDataSource.close();
        super.onPause();
    }

    @Override
    public void onBackPressed() {

        /*
         * Intercepting the back button press since we need to handle the Cards
         * view
         */
        if (mExitOnBackPressed) {

            finish();
        } else {

            showCardSetsFragment(true);
        }
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {

        super.onKeyUp(keyCode, event);

        if (keyCode == KeyEvent.KEYCODE_MENU) {

            mMainApplication.doAction(ACTION_SHOW_OVERFLOW_ACTIONS);
        }

        return true;
    }

    private void setHelpContext(Integer context) {

        if (null != context) {

            this.mHelpContext = context.intValue();
        }
    }

    private void showCardSetsFragment(boolean addToBackStack) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        if (null == mActionbarFragment) {

            mActionbarFragment = ActionbarFragment.newInstance(LIST_FRAGMENT);
            fragmentTransaction.replace(R.id.actionbarContainer, mActionbarFragment);
        } else {

            mActionbarFragment.configureFor(LIST_FRAGMENT);
        }

        if (null == mCardSetsFragment) {

            mCardSetsFragment = new CardSetsFragment();
        }

        fragmentTransaction.replace(R.id.fragmentContainer, mCardSetsFragment);

        if (addToBackStack) {

            fragmentTransaction.addToBackStack(null);
        }

        fragmentTransaction.commit();

        mFragmentContainer.setVisibility(View.VISIBLE);
        mViewPager.setVisibility(View.GONE);
        mHelpContext = HELP_CONTEXT_CARD_SET_LIST;
        mActiveFragmentReference = LIST_FRAGMENT;
        mExitOnBackPressed = true;
    }

    private void showAddCardFragment(CardSet cardSet) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        if (null == mActionbarFragment) {

            mActionbarFragment = ActionbarFragment.newInstance(ADD_FRAGMENT);
            fragmentTransaction.replace(R.id.actionbarContainer, mActionbarFragment);
        } else {

            mActionbarFragment.configureFor(ADD_FRAGMENT);
        }

        if (null == mAddCardFragment) {

            mAddCardFragment = new AddCardFragment();
        }

        mAddCardFragment.setCardSet(cardSet);

        fragmentTransaction.replace(R.id.fragmentContainer, mAddCardFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

        mHelpContext = HELP_CONTEXT_ADD_CARD;
        mActiveFragmentReference = ADD_FRAGMENT;
        mExitOnBackPressed = false;
    }

    private void showSetupFragment() {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        if (null == mActionbarFragment) {

            mActionbarFragment = ActionbarFragment.newInstance(SETUP_FRAGMENT);
            fragmentTransaction.replace(R.id.actionbarContainer, mActionbarFragment);
        } else {

            mActionbarFragment.configureFor(SETUP_FRAGMENT);
        }

        if (null == mSetupFragment) {

            mSetupFragment = new SetupFragment();
        }

        fragmentTransaction.replace(R.id.fragmentContainer, mSetupFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

        mHelpContext = HELP_CONTEXT_SETUP;
        mActiveFragmentReference = SETUP_FRAGMENT;
        mExitOnBackPressed = false;
    }

    private void showAboutFragment() {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        if (null == mActionbarFragment) {

            mActionbarFragment = ActionbarFragment.newInstance(ABOUT_FRAGMENT);
            fragmentTransaction.replace(R.id.actionbarContainer, mActionbarFragment);
        } else {

            mActionbarFragment.configureFor(ABOUT_FRAGMENT);
        }

        if (null == mAboutFragment) {

            mAboutFragment = new AboutFragment();
        }

        fragmentTransaction.replace(R.id.fragmentContainer, mAboutFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

        mHelpContext = HELP_CONTEXT_DEFAULT;
        mActiveFragmentReference = ABOUT_FRAGMENT;
        mExitOnBackPressed = false;
    }

    private void showCardsFragment(CardSet cardSet) {

        mCurrentCardSet = cardSet;

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        if (null == mActionbarFragment) {

            mActionbarFragment = ActionbarFragment.newInstance(CARDS_FRAGMENT);
            fragmentTransaction.replace(R.id.actionbarContainer, mActionbarFragment);
        } else {

            mActionbarFragment.configureFor(CARDS_FRAGMENT);
        }

        mCardsPager = new CardsPager(this, mDataSource, cardSet, mFontSize);

        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

        mFragmentContainer.setVisibility(View.GONE);
        mViewPager.setVisibility(View.VISIBLE);
        mHelpContext = HELP_CONTEXT_VIEW_CARD;
        mActiveFragmentReference = CARDS_FRAGMENT;
        mExitOnBackPressed = false;
    }

    private void showHelp() {

        HelpDialog helpDialog = new HelpDialog(this);

        switch (mHelpContext) {

        case HELP_CONTEXT_DEFAULT:
            helpDialog.setHelp(getResources().getString(R.string.help_content_default));
            break;

        case HELP_CONTEXT_SETUP:
            helpDialog.setHelp(getResources().getString(R.string.help_content_setup));
            break;

        case HELP_CONTEXT_CARD_SET_LIST:
            helpDialog.setHelp(getResources().getString(R.string.help_content_card_set_list));
            break;

        case HELP_CONTEXT_ADD_CARD:
            helpDialog.setHelp(getResources().getString(R.string.help_content_add_card));
            break;

        case HELP_CONTEXT_VIEW_CARD:
            helpDialog.setHelp(getResources().getString(R.string.help_content_view_card));
            break;

        default:
            helpDialog.setHelp(getResources().getString(R.string.help_content_default));
            break;
        }

        helpDialog.show();
    }

    private void getExternal() {

        if (mActiveFragmentReference == SETUP_FRAGMENT) {

            showCardSetsFragment(true);
        }

        if (null == mCardSetsFragment) {

            Toast.makeText(getApplicationContext(), R.string.external_data_message_error, Toast.LENGTH_SHORT)
                    .show();
        } else {

            mCardSetsFragment.getFlashCardExchangeCardSets();
        }
    }

    private int getFontSizePreference(int fontSizePreference) {

        int fontSize = NORMAL_FONT_SIZE;

        switch (fontSizePreference) {

        case PREFERENCE_SMALL_FONT_SIZE:
            fontSize = SMALL_FONT_SIZE;
            break;
        case PREFERENCE_NORMAL_FONT_SIZE:
            fontSize = NORMAL_FONT_SIZE;
            break;
        case PREFERENCE_LARGE_FONT_SIZE:
            fontSize = LARGE_FONT_SIZE;
            break;
        default:
            fontSize = NORMAL_FONT_SIZE;
            break;
        }

        return fontSize;
    }

    private void sendFeedback() {

        String toList[] = { FEEDBACK_EMAIL_ADDRESS };

        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.setType("plain/text");
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, toList);
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
                getResources().getString(R.string.email_feedback_subject));

        startActivity(Intent.createChooser(emailIntent, getResources().getString(R.string.email_feedback_chooser)));
    }

    public DataSource getDataSource() {

        return mDataSource;
    }

    /*
     * Helper method to check if there is network connectivity
     */
    public boolean hasConnectivity() {

        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(
                Context.CONNECTIVITY_SERVICE);

        if (null == connectivityManager) {

            return false;
        }

        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

        if (null != networkInfo && networkInfo.isAvailable() && networkInfo.isConnected()) {

            return true;
        } else {

            return false;
        }
    }

    public void doAction(Integer action, Object data) {

        switch (action) {

        case ACTION_SHOW_CARD_SETS:
            boolean addToBackStack = (null != data ? ((Boolean) data).booleanValue() : false);
            showCardSetsFragment(addToBackStack);
            break;
        case ACTION_SHOW_CARDS:
            showCardsFragment((CardSet) data);
            break;
        case ACTION_SHOW_HELP:
            showHelp();
            break;
        case ACTION_SHOW_SETUP:
            showSetupFragment();
            break;
        case ACTION_SHOW_ABOUT:
            showAboutFragment();
            break;
        case ACTION_GET_EXTERNAL_CARD_SETS:
            getExternal();
            break;
        case ACTION_SET_HELP_CONTEXT:
            setHelpContext((Integer) data);
            break;
        case ACTION_SHOW_ADD_CARD:
            showAddCardFragment((CardSet) data);
            break;
        case ACTION_ADD_CARD_SET:
            mCardSetsFragment.addCardSet((CardSet) data);
            break;
        case ACTION_FONT_SIZE_CHANGE:
            int fontSizePreference = (null != data ? ((Integer) data).intValue() : PREFERENCE_NORMAL_FONT_SIZE);
            mFontSize = getFontSizePreference(fontSizePreference);
            break;
        case ACTION_SEND_FEEDBACK:
            sendFeedback();
            break;
        case ACTION_RESHUFFLE_CARDS:
            showCardsFragment(mCurrentCardSet);
            break;
        }
    }
}