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();
}
}
}