dat255.grupp06.bibbla.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for dat255.grupp06.bibbla.MainActivity.java

Source

/**
   Copyright 2012 Fahad Al-Khameesi, Madeleine Appert, Niklas Logren, Arild Matsson and Jonathan Orr.
    
This file is part of Bibbla.
    
Bibbla 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 3 of the License, or
(at your option) any later version.
    
Bibbla 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 Bibbla.  If not, see <http://www.gnu.org/licenses/>.    
 **/

package dat255.grupp06.bibbla;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Window;

import dat255.grupp06.bibbla.backend.BackendFactory;
import dat255.grupp06.bibbla.backend.IBackend;
import dat255.grupp06.bibbla.fragments.LibraryFragment;
import dat255.grupp06.bibbla.fragments.ProfileFragment;
import dat255.grupp06.bibbla.fragments.SearchFragment;
import dat255.grupp06.bibbla.frontend.LoginCallbackHandler;
import dat255.grupp06.bibbla.frontend.LoginOverlayActivity;
import dat255.grupp06.bibbla.model.Credentials;
import dat255.grupp06.bibbla.utils.Callback;
import dat255.grupp06.bibbla.utils.Message;

public class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener, LoginCallbackHandler {

    private IBackend backend;

    public static final int RESULT_LOGIN_FORM = 0;
    public static final String EXTRA_CREDENTIALS = "credentials";

    SearchFragment searchFragment;
    ProfileFragment profileFragment;
    LibraryFragment libraryFragment;
    private Callback loginDoneCallback;

    ActionBar.Tab searchTab;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        setTheme(com.actionbarsherlock.R.style.Theme_Sherlock); //Used for theme switching in samples
        super.onCreate(savedInstanceState);
        // We want a fancy spinner for marking progress.
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

        setContentView(R.layout.activity_main);

        backend = BackendFactory.getBackend();

        // Hide progress bar by default.
        setSupportProgressBarIndeterminateVisibility(false);

        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        getSupportActionBar().setDisplayShowHomeEnabled(false);

        //Create the tabs
        searchTab = getSupportActionBar().newTab();
        ActionBar.Tab profileTab = getSupportActionBar().newTab();
        ActionBar.Tab libraryTab = getSupportActionBar().newTab();

        //Set tab properties
        searchTab.setContentDescription("Sk");
        searchTab.setIcon(R.drawable.search_icon);
        searchTab.setTabListener(this);

        profileTab.setContentDescription("Ln");
        profileTab.setIcon(R.drawable.profile_icon);
        profileTab.setTabListener(this);

        libraryTab.setContentDescription("Bibliotek");
        libraryTab.setIcon(R.drawable.lib_icon);
        libraryTab.setTabListener(this);

        //Add the tabs to the action bar
        getSupportActionBar().addTab(searchTab);
        getSupportActionBar().addTab(profileTab);
        getSupportActionBar().addTab(libraryTab);

        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        String card = sharedPreferences.getString("card", "");
        String pin = sharedPreferences.getString("pin", "");
        String name = sharedPreferences.getString("name", "");

        backend.saveCredentials(new Credentials(name, card, pin));

    }

    @Override
    public void onResume() {
        super.onResume();
        // Nothing atm
    }

    /**
     * {@inheritdoc}
     * 
     * This is called when a user is done with LoginOverlayActivity. Saves the
     * specified credentials and tells Backend to log in.
     * @param data should contain a Credentials object as an Extra, identified
     * by LoginManager.EXTRA_CREDENTIALS
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_CANCELED) {
            profileFragment.setDontLogin(true);
        }

        switch (requestCode) {
        case RESULT_LOGIN_FORM:
            // Get credentials

            if (resultCode != RESULT_CANCELED) {
                Credentials cred = (Credentials) data.getSerializableExtra(EXTRA_CREDENTIALS);
                if (cred == null) {
                    // Retry login form (recursive)
                    showCredentialsDialog(loginDoneCallback);
                } else {
                    this.saveCredentials(cred);
                    backend.saveCredentials(cred);
                    profileFragment.setDontGetCachedBooks(true);
                }
            }

            loginDoneCallback.handleMessage(new Message());
            // The callback should not be handled more than once.
            loginDoneCallback = null;
            break;
        default:
            throw new IllegalArgumentException("onActivityResult was called " + "with an unknown request code");
        }
    }

    /**
     * Saves the credentials to shared preferences
     * @param cred - The credentials ot be saved
     */
    private void saveCredentials(Credentials cred) {
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("name", cred.name);
        editor.putString("card", cred.card);
        editor.putString("pin", cred.pin);
        editor.commit();

    }

    @Override
    public void onTabSelected(final Tab tab, final FragmentTransaction ft) {
        // TODO Refactor to eliminate duplicate code?
        switch (tab.getPosition()) {
        case 0:
            if (searchFragment == null) {
                searchFragment = new SearchFragment();
                ft.add(R.id.fragment_container, searchFragment);
            } else {
                ft.attach(searchFragment);
                profileFragment.setDontLogin(false);
            }
            break;
        case 1:
            if (profileFragment == null) {
                profileFragment = new ProfileFragment();
                ft.add(R.id.fragment_container, profileFragment);
            } else {
                ft.attach(profileFragment);
            }

            break;
        case 2:
            if (libraryFragment == null) {
                libraryFragment = new LibraryFragment();
                libraryFragment.setBackend(backend);
                ft.add(R.id.fragment_container, libraryFragment);
            } else {
                ft.attach(libraryFragment);
                profileFragment.setDontLogin(false);
            }
            break;
        }
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {

        // Hide keyboard and spinner
        hideKeyboard();
        setSupportProgressBarIndeterminateVisibility(false);

        // Detach the correct fragment.
        switch (tab.getPosition()) {
        case 0:
            ft.detach(searchFragment);
            break;
        case 1:
            ft.detach(profileFragment);
            profileFragment.cancelUpdate();
            break;
        case 2:
            ft.detach(libraryFragment);
            break;
        }
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

    /**
     * Logs out and switches to the Search fragment.
     * @param view
     */
    public void logout(View view) {
        this.emptyPrefernces();
        backend.logOut();
        profileFragment.setDontGetCachedBooks(true);
        getSupportActionBar().selectTab(searchTab);
    }

    /**
     * The method name says is it all.
     */
    private void emptyPrefernces() {
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("name", "");
        editor.putString("card", "");
        editor.putString("pin", "");
        editor.commit();
    }

    /**
     * Is called when the Search button is clicked.
     * @param view - The view the click came from.
     */
    public void searchClicked(View view) {
        hideKeyboard();
        searchFragment.searchClicked();
    }

    /**
     * Tunnel method from searchListFragment to searchFragment
     * @param page - what page to fetch
     * @param searchString - what to search for
     */
    public void moreSearchResultsClicked(int page, String searchString) {
        searchFragment.getMoreSearchResults(page, searchString);
    }

    /**
     * Hides the virtual keyboard.
     */
    private void hideKeyboard() {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(findViewById(android.R.id.content).getWindowToken(), 0);
    }

    @Override
    public void showCredentialsDialog(Callback callback) {
        this.loginDoneCallback = callback;
        Intent intent = new Intent(this, LoginOverlayActivity.class);
        startActivityForResult(intent, RESULT_LOGIN_FORM);
    }

    /**
     * Selects the search tab
     */
    public void selectSearchTab() {
        getSupportActionBar().selectTab(searchTab);
    }
}