/* * 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.activities.viewer.html.dashboard; import android.annotation.SuppressLint; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.webkit.WebView; import android.widget.Toast; import com.jaspersoft.android.jaspermobile.R; import com.jaspersoft.android.jaspermobile.activities.inputcontrols.InputControlsActivity; import com.jaspersoft.android.jaspermobile.activities.inputcontrols.InputControlsActivity_; import com.jaspersoft.android.jaspermobile.domain.SimpleSubscriber; import com.jaspersoft.android.jaspermobile.domain.interactor.dashboard.GetDashboardControlsCase; import com.jaspersoft.android.jaspermobile.domain.interactor.dashboard.GetDashboardVisualizeParamsCase; import com.jaspersoft.android.jaspermobile.domain.interactor.report.FlushInputControlsCase; import com.jaspersoft.android.jaspermobile.domain.interactor.report.GetReportMetadataCase; import com.jaspersoft.android.jaspermobile.network.RequestExceptionHandler; import com.jaspersoft.android.jaspermobile.ui.view.activity.ReportVisualizeActivity_; import com.jaspersoft.android.jaspermobile.util.ScrollableTitleHelper; import com.jaspersoft.android.jaspermobile.webview.WebInterface; import com.jaspersoft.android.jaspermobile.webview.WebViewEnvironment; import com.jaspersoft.android.jaspermobile.webview.dashboard.bridge.AmberTwoDashboardExecutor; import com.jaspersoft.android.jaspermobile.webview.dashboard.bridge.DashboardCallback; import com.jaspersoft.android.jaspermobile.webview.dashboard.bridge.DashboardExecutor; import com.jaspersoft.android.jaspermobile.webview.dashboard.bridge.DashboardTrigger; import com.jaspersoft.android.jaspermobile.webview.dashboard.bridge.DashboardWebInterface; import com.jaspersoft.android.jaspermobile.webview.dashboard.bridge.JsDashboardTrigger; import com.jaspersoft.android.sdk.client.oxm.resource.ResourceLookup; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Extra; import org.androidannotations.annotations.InstanceState; import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.UiThread; import javax.inject.Inject; /** * @author Tom Koptel * @since 2.0 */ @OptionsMenu(R.menu.report_filter_manager_menu) @EActivity public class Amber2DashboardActivity extends BaseDashboardActivity implements DashboardCallback { private static final int REQUEST_DASHBOARDS_PARAMETERS = 200; @InstanceState protected boolean mMaximized; @Inject GetDashboardControlsCase mGetDashboardControlsCase; @Inject FlushInputControlsCase mFlushInputControlsCase; @Inject GetDashboardVisualizeParamsCase mGetDashboardVisualizeParamsCase; @Inject GetReportMetadataCase mGetReportMetadataCase; @Inject RequestExceptionHandler mExceptionHandler; private boolean mFavoriteItemVisible, mInfoItemVisible, mFiltersVisible; private MenuItem favoriteAction, aboutAction, filerAction; private DashboardTrigger mDashboardTrigger; private WebInterface mWebInterface; private DashboardExecutor mDashboardExecutor; private DialogInterface.OnCancelListener cancelListener = new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { Amber2DashboardActivity.super.onBackPressed(); } }; @SuppressLint("ShowToast") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getComponent().inject(this); mGetDashboardControlsCase.execute(resource.getUri(), new GenericSubscriber<>(new SimpleSubscriber<Boolean>() { @Override public void onError(Throwable e) { mFiltersVisible = false; } @Override public void onNext(Boolean hasControls) { mFiltersVisible = hasControls; invalidateOptionsMenu(); } })); showMenuItems(); } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean result = super.onCreateOptionsMenu(menu); favoriteAction = menu.findItem(R.id.favoriteAction); aboutAction = menu.findItem(R.id.aboutAction); filerAction = menu.findItem(R.id.showFilters); return result; } @Override public boolean onPrepareOptionsMenu(Menu menu) { boolean result = super.onPrepareOptionsMenu(menu); favoriteAction.setVisible(mFavoriteItemVisible); aboutAction.setVisible(mInfoItemVisible); filerAction.setVisible(mFiltersVisible); return result; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.showFilters) { InputControlsActivity_.intent(Amber2DashboardActivity.this) .reportUri(resource.getUri()) .dashboardInputControl(true) .startForResult(REQUEST_DASHBOARDS_PARAMETERS); return true; } return super.onOptionsItemSelected(item); } @OnActivityResult(REQUEST_DASHBOARDS_PARAMETERS) final void onNewParametersResult(int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { boolean isNewParamsEqualOld = data.getBooleanExtra( InputControlsActivity.RESULT_SAME_PARAMS, false); if (!isNewParamsEqualOld) { applyParams(); } } } @Override protected void onPause() { if (mWebInterface != null) { mWebInterface.pause(); } super.onPause(); } @Override protected void onResume() { super.onResume(); if (mWebInterface != null) { mWebInterface.resume(); } } @Override protected String getScreenName() { return getString(R.string.ja_dvs_v); } //--------------------------------------------------------------------- // Abstract methods implementations //--------------------------------------------------------------------- @Override public void onWebViewConfigured(WebView webView) { mDashboardTrigger = JsDashboardTrigger.with(webView); mDashboardExecutor = AmberTwoDashboardExecutor.newInstance(webView, mServer, resource); mWebInterface = DashboardWebInterface.from(this); WebViewEnvironment.configure(webView) .withWebInterface(mWebInterface); loadFlow(); } @UiThread @Override public void onMaximizeStart(String title) { resetZoom(); hideMenuItems(); showLoading(); } @UiThread @Override public void onMaximizeEnd(String title) { hideLoading(); resetZoom(); mMaximized = true; scrollableTitleHelper.injectTitle(title); } @UiThread @Override public void onMaximizeFailed(String error) { hideLoading(); } @UiThread @Override public void onMinimizeStart() { resetZoom(); showMenuItems(); showLoading(); } @UiThread @Override public void onMinimizeEnd() { hideLoading(); mMaximized = false; } @UiThread @Override public void onMinimizeFailed(String error) { } @UiThread @Override public void onScriptLoaded() { runDashboard(); } @UiThread @Override public void onLoadStart() { showLoading(); } @UiThread @Override public void onLoadDone() { showWebView(true); hideLoading(); } @UiThread @Override public void onLoadError(String error) { Toast.makeText(this, error, Toast.LENGTH_SHORT).show(); hideLoading(); } @UiThread @Override public void onReportExecution(String data) { mGetReportMetadataCase.execute(data, new GenericSubscriber<>(new SimpleSubscriber<ResourceLookup>() { @Override public void onNext(ResourceLookup lookup) { ReportVisualizeActivity_.intent(Amber2DashboardActivity.this) .resource(lookup) .start(); } })); } @Override public void onWindowResizeStart() { } @Override public void onWindowResizeEnd() { } @UiThread @Override public void onAuthError(String message) { scrollableTitleHelper.injectTitle(resource.getLabel()); Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); super.onSessionExpired(); } @UiThread @Override public void onWindowError(String errorMessage) { showMessage(getString(R.string.failed_load_data)); hideLoading(); } @Override public void onPageFinished() { } @Override public void onRefresh() { if (mMaximized) { mDashboardTrigger.refreshDashlet(); } else { mDashboardTrigger.refreshDashboard(); } } @Override public void onHomeAsUpCalled() { if (mMaximized && webView != null) { mDashboardTrigger.minimizeDashlet(); scrollableTitleHelper.injectTitle(resource.getLabel()); } else { super.onBackPressed(); } } @Override public void onSessionRefreshed() { loadFlow(); } @Override public void finish() { mGetDashboardControlsCase.unsubscribe(); mGetDashboardVisualizeParamsCase.unsubscribe(); mGetReportMetadataCase.unsubscribe(); mFlushInputControlsCase.execute(resource.getUri()); super.finish(); } //--------------------------------------------------------------------- // Helper methods //--------------------------------------------------------------------- private void loadFlow() { mDashboardExecutor.prepare(); } private void runDashboard() { mDashboardExecutor.execute(); } private void applyParams() { mGetDashboardVisualizeParamsCase.execute(resource.getUri(), new GenericSubscriber<>(new SimpleSubscriber<String>() { @Override public void onError(Throwable e) { String message = RequestExceptionHandler.extractMessage(Amber2DashboardActivity.this, e); showMessage(message); } @Override public void onNext(String params) { mDashboardTrigger.applyParams(params); } })); } private void showMenuItems() { mFavoriteItemVisible = mInfoItemVisible = true; supportInvalidateOptionsMenu(); } private void hideMenuItems() { mFavoriteItemVisible = mInfoItemVisible = false; supportInvalidateOptionsMenu(); } }