/* * 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.storage.fragment; import android.content.ActivityNotFoundException; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.view.View; import android.webkit.MimeTypeMap; import android.widget.TextView; import android.widget.Toast; import com.jaspersoft.android.jaspermobile.Analytics; import com.jaspersoft.android.jaspermobile.R; import com.jaspersoft.android.jaspermobile.activities.info.ResourceInfoActivity_; import com.jaspersoft.android.jaspermobile.activities.save.SaveReportService; import com.jaspersoft.android.jaspermobile.activities.viewer.html.SavedReportHtmlViewerActivity_; import com.jaspersoft.android.jaspermobile.db.database.table.SavedItemsTable; import com.jaspersoft.android.jaspermobile.db.provider.JasperMobileDbProvider; import com.jaspersoft.android.jaspermobile.domain.Profile; import com.jaspersoft.android.jaspermobile.ui.view.fragment.BaseFragment; import com.jaspersoft.android.jaspermobile.util.JasperSettings; import com.jaspersoft.android.jaspermobile.util.ViewType; import com.jaspersoft.android.jaspermobile.util.filtering.StorageResourceFilter; import com.jaspersoft.android.jaspermobile.util.resource.JasperResource; import com.jaspersoft.android.jaspermobile.util.resource.viewbinder.JasperResourceAdapter; import com.jaspersoft.android.jaspermobile.util.resource.viewbinder.JasperResourceConverter; import com.jaspersoft.android.jaspermobile.util.sorting.SortOrder; import com.jaspersoft.android.jaspermobile.widget.JasperRecyclerView; import com.jaspersoft.android.sdk.util.FileUtils; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.FragmentArg; import org.androidannotations.annotations.InstanceState; import org.androidannotations.annotations.UiThread; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; import javax.inject.Inject; /** * @author Tom Koptel * @since 1.9 */ @EFragment(R.layout.fragment_resource) public class SavedItemsFragment extends BaseFragment implements LoaderManager.LoaderCallbacks<Cursor> { public static final String TAG = SavedItemsFragment.class.getSimpleName(); private final int SAVED_ITEMS_LOADER_ID = 10; @FragmentArg protected ViewType viewType; @Inject protected Analytics analytics; @Inject protected Profile mProfile; @Inject protected JasperResourceConverter jasperResourceConverter; protected JasperRecyclerView listView; protected TextView emptyText; @FragmentArg @InstanceState protected String searchQuery; @FragmentArg @InstanceState protected SortOrder sortOrder; @Bean protected StorageResourceFilter storageResourceFilter; private JasperResourceAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getBaseActivityComponent().inject(this); analytics.setScreenName(Analytics.ScreenName.SAVED_ITEMS.getValue()); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); listView = (JasperRecyclerView) view.findViewById(android.R.id.list); emptyText = (TextView) view.findViewById(android.R.id.empty); setEmptyText(0); setDataAdapter(); getActivity().getSupportLoaderManager().restartLoader(SAVED_ITEMS_LOADER_ID, null, this); } @Override public void onResume() { super.onResume(); List<Analytics.Dimension> viewDimension = new ArrayList<>(); viewDimension.add(new Analytics.Dimension(Analytics.Dimension.FILTER_TYPE_HIT_KEY, storageResourceFilter.getCurrent().getName())); viewDimension.add(new Analytics.Dimension(Analytics.Dimension.RESOURCE_VIEW_HIT_KEY, viewType.name())); analytics.sendScreenView(Analytics.ScreenName.SAVED_ITEMS.getValue(), viewDimension); } @UiThread protected void setEmptyText(int resId) { if (resId == 0) { emptyText.setVisibility(View.GONE); } else { emptyText.setVisibility(View.VISIBLE); emptyText.setText(resId); } } public void showSavedItemsByFilter() { analytics.sendEvent(Analytics.EventCategory.CATALOG.getValue(), Analytics.EventAction.FILTERED.getValue(), storageResourceFilter.getCurrent().getName()); getActivity().getSupportLoaderManager().restartLoader(SAVED_ITEMS_LOADER_ID, null, this); } public void showSavedItemsBySortOrder(SortOrder selectedSortOrder) { analytics.sendEvent(Analytics.EventCategory.CATALOG.getValue(), Analytics.EventAction.SORTED.getValue(), sortOrder.name()); sortOrder = selectedSortOrder; getActivity().getSupportLoaderManager().restartLoader(SAVED_ITEMS_LOADER_ID, null, this); } //--------------------------------------------------------------------- // Helper methods //--------------------------------------------------------------------- private void openReportFile(File reportOutputFile, String recordUri) { Locale current = getResources().getConfiguration().locale; String fileName = reportOutputFile.getName(); String baseName = FileUtils.getBaseName(fileName); String extension = FileUtils.getExtension(fileName).toLowerCase(current); if ("HTML".equalsIgnoreCase(extension)) { // run the html report viewer SavedReportHtmlViewerActivity_.intent(this) .reportFile(reportOutputFile) .resourceLabel(baseName) .recordUri(recordUri) .start(); } else { // run external viewer according to the file format String contentType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); Uri reportOutputPath = Uri.fromFile(reportOutputFile); Intent externalViewer = new Intent(Intent.ACTION_VIEW); externalViewer.setDataAndType(reportOutputPath, contentType); externalViewer.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); try { startActivity(externalViewer); } catch (ActivityNotFoundException e) { // show notification if no app available to open selected format Toast.makeText(getActivity(), getString(R.string.sdr_t_no_app_available, extension), Toast.LENGTH_SHORT).show(); } } } private void showFileNotReadyMessage() { Toast.makeText(getActivity(), getString(R.string.sdr_loading_msg), Toast.LENGTH_SHORT).show(); } private void setDataAdapter() { mAdapter = new JasperResourceAdapter(getActivity()); mAdapter.setOnItemInteractionListener(new JasperResourceAdapter.OnResourceInteractionListener() { @Override public void onResourceItemClicked(JasperResource jasperResource) { String id = jasperResource.getId(); if (isDownloading(id)) { File file = jasperResourceConverter.convertToFile(id, getActivity()); openReportFile(file, id); } else { showFileNotReadyMessage(); } } @Override public void onSecondaryActionClicked(JasperResource jasperResource) { if (isDownloading(jasperResource.getId())) { ResourceInfoActivity_.intent(getActivity()) .jasperResource(jasperResource) .start(); } else { SaveReportService.cancel(getContext(), Uri.parse(jasperResource.getId())); } } }); listView.setAdapter(mAdapter); listView.changeViewType(viewType); } private boolean isDownloading(String id) { Cursor cursor = getActivity().getContentResolver().query(Uri.parse(id), null, null, null, null); cursor.moveToFirst(); boolean downloaded = cursor.getInt(cursor.getColumnIndex(SavedItemsTable.DOWNLOADED)) == 1; cursor.close(); return downloaded; } //--------------------------------------------------------------------- // Implements LoaderManager.LoaderCallbacks<Cursor> //--------------------------------------------------------------------- @Override public Loader<Cursor> onCreateLoader(int code, Bundle bundle) { StringBuilder selection = new StringBuilder(""); ArrayList<String> selectionArgs = new ArrayList<String>(); //Add general items (server id = -1) selection .append("(") .append(SavedItemsTable.ACCOUNT_NAME + " =?") .append(" OR "); selectionArgs.add(JasperSettings.RESERVED_ACCOUNT_NAME); //Add server profile id to WHERE params selection.append(SavedItemsTable.ACCOUNT_NAME + " =?"); selectionArgs.add(mProfile.getKey()); // Close select brackets selection.append(")"); //Add filtration to WHERE params selection.append(" AND ("); Iterator<String> iterator = storageResourceFilter.getCurrent().getValues().iterator(); while (iterator.hasNext()) { selection.append(SavedItemsTable.FILE_FORMAT + " =?"); selectionArgs.add(iterator.next()); if (iterator.hasNext()) { selection.append(" OR "); } } selection.append(")"); //Add sorting type to WHERE params String sortOrderString; if (sortOrder != null && sortOrder.getValue().equals(SortOrder.CREATION_DATE.getValue())) { sortOrderString = SavedItemsTable.CREATION_TIME + " DESC"; } else { sortOrderString = SavedItemsTable.NAME + " COLLATE NOCASE ASC"; } //Add search query to WHERE params boolean inSearchMode = searchQuery != null; if (inSearchMode) { selection.append(" AND ") .append(SavedItemsTable.NAME + " LIKE ?"); selectionArgs.add("%" + searchQuery + "%"); } return new CursorLoader(getActivity(), JasperMobileDbProvider.SAVED_ITEMS_CONTENT_URI, SavedItemsTable.ALL_COLUMNS, selection.toString(), selectionArgs.toArray(new String[selectionArgs.size()]), sortOrderString); } @Override public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { mAdapter.clear(); mAdapter.addAll(jasperResourceConverter.convertToJasperResource(cursor)); mAdapter.notifyDataSetChanged(); if (cursor.getCount() > 0) { setEmptyText(0); } else { setEmptyText(searchQuery == null ? R.string.sdr_ab_list_msg : R.string.resources_not_found); } } @Override public void onLoaderReset(Loader<Cursor> cursorLoader) { mAdapter.clear(); mAdapter.notifyDataSetChanged(); } }