org.intermine.app.activity.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.intermine.app.activity.MainActivity.java

Source

package org.intermine.app.activity;

/*
 * Copyright (C) 2015 InterMine
 *
 * This code may be freely distributed and modified under the
 * terms of the GNU Lesser General Public Licence.  This should
 * be distributed with the code.  See the LICENSE file for more
 * information or http://www.gnu.org/copyleft/lesser.html.
 *
 */

import android.content.Intent;
import android.os.Bundle;
import android.support.design.internal.NavigationMenuPresenter;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import org.intermine.app.R;
import org.intermine.app.core.Gene;
import org.intermine.app.core.templates.Template;
import org.intermine.app.fragment.FavoritesListFragment;
import org.intermine.app.fragment.InfoFragment;
import org.intermine.app.fragment.ListsFragment;
import org.intermine.app.fragment.LogInFragment;
import org.intermine.app.fragment.SearchFragment;
import org.intermine.app.fragment.TemplatesFragment;
import org.intermine.app.listener.OnGeneSelectedListener;
import org.intermine.app.util.Strs;

import java.lang.reflect.Field;
import java.util.Set;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;

public class MainActivity extends BaseActivity implements OnGeneSelectedListener,
        ListsFragment.OnListSelectedListener, TemplatesFragment.OnTemplateSelectedListener {
    public static final int LOGIN_ACTIVITY_CODE = 0x3435;

    @InjectView(R.id.default_toolbar)
    protected Toolbar mToolbar;

    @InjectView(R.id.drawer_layout)
    protected DrawerLayout mDrawerLayout;

    @InjectView(R.id.navigation_view)
    protected NavigationView mNavigationView;

    private TextView mMineNameView;

    protected CharSequence mTitle;
    private String mMineName;
    private boolean mMainMenuDisplayed;
    private int mLastSelectedMenuItem;

    // --------------------------------------------------------------------------------------------
    // Activity Lifecycle
    // --------------------------------------------------------------------------------------------

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.InterMine_Theme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        ButterKnife.inject(this);

        View headerLayout = mNavigationView.getHeaderView(0);
        headerLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onDrawerHeaderClick();
            }
        });
        mMineNameView = (TextView) headerLayout.findViewById(R.id.mine_title);

        if (null == savedInstanceState) {
            populateContentFragment(SearchFragment.newInstance(false));
        }
        initToolbar();
        setupDrawerLayout();
    }

    @Override
    protected void onStart() {
        super.onStart();
        mMineName = getStorage().getWorkingMineName();
        Set<String> mines = getStorage().getSelectedMineNames();

        if (!mines.contains(mMineName)) {
            mMineName = mines.iterator().next();
            getStorage().setWorkingMineName(mMineName);
        }
        mMineNameView.setText(mMineName);
    }

    // --------------------------------------------------------------------------------------------
    // Event Listeners
    // --------------------------------------------------------------------------------------------

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            setMainMenuDisplayed(false);
            toggleExpandedView(false);

            mMainMenuDisplayed = true;
            mDrawerLayout.openDrawer(GravityCompat.START);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void onDrawerHeaderClick() {
        setMainMenuDisplayed(mMainMenuDisplayed);
        toggleExpandedView(mMainMenuDisplayed);

        mMainMenuDisplayed = !mMainMenuDisplayed;
    }

    public void onSectionAttached(String title) {
        mTitle = title;
        setTitle(mTitle);
    }

    @Override
    public void onGeneSelected(Gene gene) {
        GeneViewActivity.start(this, gene);
    }

    @Override
    public void onListSelected(org.intermine.app.core.List list, String mineName) {
        GenesListActivity.start(this, list, mineName);
    }

    @Override
    public void onTemplateSelected(Template template, String mineName) {
        TemplateActivity.start(this, template, mineName);
    }

    @Override
    public void onDialogDismissed(int code) {
        if (UNAUTHORIZED_CODE == code) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            Fragment fragment = LogInFragment.newInstance();
            fragmentManager.beginTransaction().replace(R.id.main_container, fragment).commit();
            setTitle(getString(R.string.log_in));
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        updateLoginState();
    }

    // --------------------------------------------------------------------------------------------
    // Helper Methods
    // --------------------------------------------------------------------------------------------

    private void initToolbar() {
        setSupportActionBar(mToolbar);
        final ActionBar actionBar = getSupportActionBar();

        if (actionBar != null) {
            actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp);
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    private void setupDrawerLayout() {
        mMainMenuDisplayed = true;
        mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {
            @Override
            public void onDrawerClosed(View drawerView) {
                if (mMainMenuDisplayed) {
                    if (R.id.drawer_settings == mLastSelectedMenuItem) {
                        Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
                        startActivity(intent);
                        mLastSelectedMenuItem = -1;
                    } else if (R.id.drawer_login == mLastSelectedMenuItem) {
                        Intent intent = new Intent(MainActivity.this, LoginActivity.class);
                        startActivityForResult(intent, LOGIN_ACTIVITY_CODE);
                        mLastSelectedMenuItem = -1;
                    } else if (R.id.drawer_logout == mLastSelectedMenuItem) {
                        getStorage().setUserToken(mMineName, null);

                        Menu menu = mNavigationView.getMenu();
                        menu.findItem(R.id.drawer_login).setVisible(true);
                        menu.findItem(R.id.drawer_logout).setVisible(false);
                        updateNavigationView();
                        mLastSelectedMenuItem = -1;
                    }
                }
            }
        }

        );
        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener()

        {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                if (mMainMenuDisplayed) {
                    populateMainContent(menuItem.getItemId());
                    mLastSelectedMenuItem = menuItem.getItemId();
                } else {
                    mMineName = menuItem.getTitle().toString();
                    getStorage().setWorkingMineName(mMineName);
                    mMineNameView.setText(mMineName);
                    updateLoginState();

                    if (menuItem.getItemId() != R.id.drawer_settings && menuItem.getItemId() != R.id.drawer_login
                            && menuItem.getItemId() != R.id.drawer_logout) {
                        populateMainContent(mLastSelectedMenuItem);
                    }
                }
                mDrawerLayout.closeDrawers();
                return true;
            }
        }

        );
    }

    protected void populateContentFragment(Fragment fragment) {
        if (null != fragment) {
            getSupportFragmentManager().beginTransaction().replace(R.id.main_container, fragment).commit();
        }
    }

    private void setMainMenuDisplayed(boolean displayed) {
        Menu menu = mNavigationView.getMenu();
        menu.setGroupVisible(R.id.main, !displayed);
        menu.setGroupVisible(R.id.rest, !displayed);

        if (displayed) {
            menu.removeGroup(R.id.mines);
            Set<String> mines = getStorage().getSelectedMineNames();
            int counter = 0;

            for (String mine : mines) {
                menu.add(R.id.mines, counter, counter, mine);
                counter++;
            }
        }
        menu.setGroupVisible(R.id.mines, displayed);
    }

    private void toggleExpandedView(boolean expanded) {
        if (expanded) {
            mMineNameView.setCompoundDrawablesWithIntrinsicBounds(null, null,
                    getResources().getDrawable(R.drawable.ic_expand_less_white_24dp), null);
        } else {
            mMineNameView.setCompoundDrawablesWithIntrinsicBounds(null, null,
                    getResources().getDrawable(R.drawable.ic_expand_more_white_24dp), null);
        }
    }

    private void populateMainContent(int menuItemId) {
        Fragment fragment = null;

        switch (menuItemId) {
        case R.id.drawer_search_all:
            fragment = SearchFragment.newInstance(true);
            break;
        case R.id.drawer_templates:
            fragment = TemplatesFragment.newInstance(mMineName);
            break;
        case R.id.drawer_lists:
            fragment = ListsFragment.newInstance(mMineName);
            break;
        case R.id.drawer_favourites:
            fragment = FavoritesListFragment.newInstance();
            break;
        case R.id.drawer_info:
            fragment = InfoFragment.newInstance();
            break;
        }
        populateContentFragment(fragment);
    }

    private void updateLoginState() {
        Menu menu = mNavigationView.getMenu();
        boolean unauthorised = Strs.isNullOrEmpty(getStorage().getUserToken(mMineName));
        menu.findItem(R.id.drawer_login).setVisible(unauthorised);
        menu.findItem(R.id.drawer_logout).setVisible(!unauthorised);
        updateNavigationView();
    }

    // HACK
    private void updateNavigationView() {
        try {
            Field presenterField = NavigationView.class.getDeclaredField("mPresenter");
            presenterField.setAccessible(true);
            ((NavigationMenuPresenter) presenterField.get(mNavigationView)).updateMenuView(false);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}