/*
* Copyright © 2016 TIBCO Software,Inc.All rights reserved.
* http://community.jaspersoft.com/project/jaspermobile-android
*
* Unless you have purchased a commercial license agreement from TIBCO Jaspersoft,
* the following license terms apply:
*
* This program is part of TIBCO Jaspersoft Mobile for Android.
*
* TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation,either version 3of the License,or
* (at your option)any later version.
*
* TIBCO Jaspersoft Mobile 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with TIBCO Jaspersoft Mobile for Android.If not,see
* <http://www.gnu.org/licenses/lgpl>.
*/
package com.jaspersoft.android.jaspermobile.ui.view.activity;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.jaspersoft.android.jaspermobile.Analytics;
import com.jaspersoft.android.jaspermobile.R;
import com.jaspersoft.android.jaspermobile.activities.favorites.FavoritesPageFragment_;
import com.jaspersoft.android.jaspermobile.activities.library.LibraryPageFragment_;
import com.jaspersoft.android.jaspermobile.activities.recent.RecentPageFragment_;
import com.jaspersoft.android.jaspermobile.activities.repository.RepositoryPageFragment_;
import com.jaspersoft.android.jaspermobile.activities.settings.SettingsActivity_;
import com.jaspersoft.android.jaspermobile.activities.storage.SavedReportsFragment_;
import com.jaspersoft.android.jaspermobile.dialog.AboutDialogFragment;
import com.jaspersoft.android.jaspermobile.dialog.RateAppDialog_;
import com.jaspersoft.android.jaspermobile.domain.Profile;
import com.jaspersoft.android.jaspermobile.internal.di.HasComponent;
import com.jaspersoft.android.jaspermobile.internal.di.components.NavigationActivityComponent;
import com.jaspersoft.android.jaspermobile.internal.di.modules.activity.NavigationActivityModule;
import com.jaspersoft.android.jaspermobile.ui.contract.NavigationContract;
import com.jaspersoft.android.jaspermobile.ui.model.ProfileViewModel;
import com.jaspersoft.android.jaspermobile.ui.presenter.NavigationPresenter;
import com.jaspersoft.android.jaspermobile.ui.presenter.fragment.JobFragmentPresenter_;
import com.jaspersoft.android.jaspermobile.util.feedback.FeedbackSender;
import com.jaspersoft.android.jaspermobile.widget.NavigationPanelLayout;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.InstanceState;
import org.androidannotations.annotations.OnActivityResult;
import org.androidannotations.annotations.ViewById;
import java.util.List;
import javax.inject.Inject;
/**
* @author Ivan Gadzhega
* @author Tom Koptel
* @author Andrew Tivodar
* @since 1.0
*/
@EActivity(R.layout.activity_navigation)
public class NavigationActivity extends CastActivity implements HasComponent<NavigationActivityComponent>, NavigationContract.View {
private static final int NEW_ACCOUNT = 20;
@ViewById(R.id.dl_navigation)
protected DrawerLayout drawerLayout;
@ViewById(R.id.npl_navigation_menu)
protected NavigationPanelLayout navigationPanelLayout;
@Inject
protected Analytics mAnalytics;
@Inject
protected NavigationPresenter mNavigationPresenter;
@Inject
protected NavigationContract.ActionListener mActionListener;
@Inject
protected FeedbackSender mFeedbackSender;
private ActionBarDrawerToggle mDrawerToggle;
@Extra
protected int currentSelection = R.id.vg_library;
@InstanceState
protected boolean customToolbarDisplayEnabled = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getComponent().inject(this);
mNavigationPresenter.injectView(this);
mActionListener.loadActiveProfile();
mActionListener.loadProfiles();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
if (savedInstanceState == null) {
navigateToCurrentSelection();
RateAppDialog_.builder().build().show(this, getSupportFragmentManager());
} else {
setDisplayCustomToolbarEnable(customToolbarDisplayEnabled);
}
}
@AfterViews
final void setupNavigation() {
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(R.string.app_label);
}
setupNavDrawer();
setupNavPanel();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
currentSelection = intent.getIntExtra(NavigationActivity_.CURRENT_SELECTION_EXTRA, R.id.vg_library);
navigateToCurrentSelection();
}
@Override
protected void onResume() {
super.onResume();
mNavigationPresenter.resume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mNavigationPresenter.destroy();
}
@Override
public NavigationActivityComponent getComponent() {
return getProfileComponent()
.plusNavigationPage(new NavigationActivityModule(this));
}
@Override
public void toggleRecentlyViewedNavigation(boolean visibility) {
View recentlyView = findViewById(R.id.vg_recent);
recentlyView.setVisibility(visibility ? View.VISIBLE : View.GONE);
}
@Override
public void showProfiles(List<ProfileViewModel> profiles) {
navigationPanelLayout.loadProfiles(profiles);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean drawerOpen = drawerLayout.isDrawerOpen(navigationPanelLayout);
hideMenuItems(menu, !drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
}
@Override
public void onSupportActionModeStarted(ActionMode mode) {
super.onSupportActionModeStarted(mode);
getToolbar().setVisibility(View.INVISIBLE);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
@Override
public void onSupportActionModeFinished(ActionMode mode) {
super.onSupportActionModeFinished(mode);
getToolbar().setVisibility(View.VISIBLE);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
@OnActivityResult(NEW_ACCOUNT)
final void newAccountAction(int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
String profileName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
Profile profile = Profile.create(profileName);
mActionListener.activateProfile(profile);
}
}
@Override
public void onBackPressed() {
// Close left panel on back press
if (drawerLayout.isDrawerOpen(navigationPanelLayout)) {
drawerLayout.closeDrawer(navigationPanelLayout);
return;
}
// Back for repository
Fragment currentPageFragment = getSupportFragmentManager().findFragmentById(R.id.main_frame);
if (currentPageFragment.isVisible()) {
FragmentManager childFm = currentPageFragment.getChildFragmentManager();
if (childFm.getBackStackEntryCount() > 0) {
childFm.popBackStack();
return;
}
}
super.onBackPressed();
}
//---------------------------------------------------------------------
// Helper methods
//---------------------------------------------------------------------
private void setupNavDrawer() {
mDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, getToolbar(),
R.string.nd_drawer_open, R.string.nd_drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
invalidateOptionsMenu();
navigationPanelLayout.notifyPanelClosed();
customToolbarDisplayEnabled = true;
setDisplayCustomToolbarEnable(true);
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
analytics.sendEvent(Analytics.EventCategory.MENU.getValue(), Analytics.EventAction.OPENED.getValue(), null);
invalidateOptionsMenu();
customToolbarDisplayEnabled = false;
setDisplayCustomToolbarEnable(false);
}
};
drawerLayout.setDrawerListener(mDrawerToggle);
}
private void setupNavPanel() {
navigationPanelLayout.setAnalytics(mAnalytics);
navigationPanelLayout.setListener(new NavigationPanelLayout.NavigationListener() {
@Override
public void onNavigate(int viewId) {
handleNavigationAction(viewId);
drawerLayout.closeDrawer(navigationPanelLayout);
}
@Override
public void onActiveProfileChange(ProfileViewModel profile) {
analytics.sendEvent(
Analytics.EventCategory.CATALOG.getValue(),
Analytics.EventAction.CLICKED.getValue(),
Analytics.EventLabel.SWITCH_ACCOUNT.getValue()
);
Profile domainProfile = Profile.create(profile.getLabel());
mActionListener.activateProfile(domainProfile);
drawerLayout.closeDrawer(navigationPanelLayout);
}
});
}
private void navigateToCurrentSelection() {
navigationPanelLayout.setItemSelected(currentSelection);
}
private void handleNavigationAction(int viewId) {
switch (viewId) {
case R.id.vg_library:
currentSelection = R.id.vg_library;
commitContent(LibraryPageFragment_.builder().build());
break;
case R.id.vg_repository:
currentSelection = R.id.vg_repository;
commitContent(RepositoryPageFragment_.builder().build());
break;
case R.id.vg_recent:
currentSelection = R.id.vg_recent;
commitContent(RecentPageFragment_.builder().build());
break;
case R.id.vg_saved_items:
currentSelection = R.id.vg_saved_items;
commitContent(SavedReportsFragment_.builder().build());
break;
case R.id.vg_favorites:
currentSelection = R.id.vg_favorites;
commitContent(FavoritesPageFragment_.builder().build());
break;
case R.id.vg_jobs:
currentSelection = R.id.vg_jobs;
commitContent(JobFragmentPresenter_.builder().build());
break;
case R.id.vg_add_account:
startActivityForResult(new Intent(this, AuthenticatorActivity.class), NEW_ACCOUNT);
break;
case R.id.vg_manage_accounts:
String[] authorities = {getString(R.string.jasper_account_authority)};
Intent manageAccIntent = new Intent(Settings.ACTION_SYNC_SETTINGS);
manageAccIntent.putExtra(Settings.EXTRA_AUTHORITIES, authorities);
try {
startActivity(manageAccIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, getString(R.string.wrong_action), Toast.LENGTH_SHORT).show();
}
break;
case R.id.tv_settings:
SettingsActivity_.intent(this).start();
break;
case R.id.tv_feedback:
sendFeedback();
break;
case R.id.tv_about:
AboutDialogFragment.createBuilder(this, getSupportFragmentManager()).show();
}
}
private void commitContent(@NonNull Fragment directFragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction
.replace(R.id.main_frame, directFragment)
.commit();
}
private void hideMenuItems(Menu menu, boolean visible) {
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(visible);
}
}
private void sendFeedback() {
boolean sendTaskWasInitiated = mFeedbackSender.initiate();
if (!sendTaskWasInitiated) {
Toast.makeText(this,
getString(R.string.sdr_t_no_app_available, "email"),
Toast.LENGTH_SHORT).show();
}
}
}