/* * 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.favorites.fragment; import android.database.Cursor; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.TextView; 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.db.database.table.FavoritesTable; import com.jaspersoft.android.jaspermobile.db.provider.JasperMobileDbProvider; import com.jaspersoft.android.jaspermobile.dialog.SortDialogFragment; import com.jaspersoft.android.jaspermobile.domain.Profile; import com.jaspersoft.android.jaspermobile.ui.view.activity.ToolbarActivity; import com.jaspersoft.android.jaspermobile.ui.view.fragment.BaseFragment; import com.jaspersoft.android.jaspermobile.util.ResourceOpener; import com.jaspersoft.android.jaspermobile.util.ViewType; import com.jaspersoft.android.jaspermobile.util.filtering.FavoritesResourceFilter; import com.jaspersoft.android.jaspermobile.util.filtering.Filter; 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.SortOptions; import com.jaspersoft.android.jaspermobile.util.sorting.SortOrder; import com.jaspersoft.android.jaspermobile.widget.FilterTitleView; import com.jaspersoft.android.jaspermobile.widget.JasperRecyclerView; import com.jaspersoft.android.sdk.client.oxm.resource.ResourceLookup; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.FragmentArg; import org.androidannotations.annotations.InstanceState; import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.OptionsMenuItem; import org.androidannotations.annotations.UiThread; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.inject.Inject; import static com.jaspersoft.android.sdk.client.oxm.resource.ResourceLookup.ResourceType; /** * @author Tom Koptel * @since 1.9 */ @EFragment(R.layout.fragment_resource) @OptionsMenu(R.menu.sort_menu) public class FavoritesFragment extends BaseFragment implements LoaderManager.LoaderCallbacks<Cursor>, SortDialogFragment.SortDialogClickListener { public static final String TAG = FavoritesFragment.class.getSimpleName(); private final int FAVORITES_LOADER_ID = 20; @Bean protected FavoritesResourceFilter favoritesResourceFilter; @Bean protected SortOptions sortOptions; @FragmentArg protected ViewType viewType; JasperRecyclerView listView; TextView emptyText; @OptionsMenuItem(R.id.sort) MenuItem sortAction; @Inject protected Analytics analytics; @Inject protected JasperResourceConverter jasperResourceConverter; @Inject protected Profile mProfile; @Bean ResourceOpener resourceOpener; @FragmentArg @InstanceState String searchQuery; private JasperResourceAdapter mAdapter; @OptionsItem(R.id.sort) final void startSorting() { SortDialogFragment.createBuilder(getFragmentManager()) .setInitialSortOption(sortOptions.getOrder()) .setTargetFragment(this) .show(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getBaseActivityComponent().inject(this); setHasOptionsMenu(true); if (savedInstanceState == null) { sortOptions.putOrder(SortOrder.LABEL); } analytics.setScreenName(Analytics.ScreenName.FAVORITES.getValue()); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (searchQuery == null) { FilterTitleView filterTitleView = new FilterTitleView(getActivity()); filterTitleView.init(favoritesResourceFilter); filterTitleView.setFilterSelectedListener(new FilterChangeListener()); ((ToolbarActivity) getActivity()).setDisplayCustomToolbarEnable(true); ((ToolbarActivity) getActivity()).setCustomToolbarView(filterTitleView); } } @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(FAVORITES_LOADER_ID, null, this); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); sortAction.setVisible(searchQuery == null); } @Override public void onResume() { super.onResume(); ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(searchQuery == null ? getString(R.string.f_title) : getString(R.string.search_result_format, searchQuery)); } List<Analytics.Dimension> viewDimension = new ArrayList<>(); viewDimension.add(new Analytics.Dimension(Analytics.Dimension.FILTER_TYPE_HIT_KEY, favoritesResourceFilter.getCurrent().getName())); viewDimension.add(new Analytics.Dimension(Analytics.Dimension.RESOURCE_VIEW_HIT_KEY, viewType.name())); analytics.sendScreenView(Analytics.ScreenName.FAVORITES.getValue(), viewDimension); } @Override public void onDestroyView() { super.onDestroyView(); getActivity().getSupportLoaderManager().destroyLoader(FAVORITES_LOADER_ID); } @UiThread protected void setEmptyText(int resId) { if (resId == 0) { emptyText.setVisibility(View.GONE); } else { emptyText.setVisibility(View.VISIBLE); emptyText.setText(resId); } } public void showFavoritesByFilter() { getActivity().getSupportLoaderManager().restartLoader(FAVORITES_LOADER_ID, null, this); } private void onViewSingleClick(ResourceLookup resource) { resourceOpener.openResource(this, FavoritesControllerFragment.PREF_TAG, resource); } private void setDataAdapter() { mAdapter = new JasperResourceAdapter(getActivity()); mAdapter.setOnItemInteractionListener(new JasperResourceAdapter.OnResourceInteractionListener() { @Override public void onResourceItemClicked(JasperResource jasperResource) { ResourceLookup resource = jasperResourceConverter.convertFavoriteToResourceLookup(jasperResource.getId(), getActivity()); onViewSingleClick(resource); } @Override public void onSecondaryActionClicked(JasperResource jasperResource) { ResourceLookup resource = jasperResourceConverter.convertFavoriteToResourceLookup(jasperResource.getId(), getActivity()); ResourceInfoActivity_.intent(getActivity()) .jasperResource(jasperResourceConverter.convertToJasperResource(resource)) .start(); } }); listView.setAdapter(mAdapter); listView.changeViewType(viewType); } //--------------------------------------------------------------------- // Implements LoaderManager.LoaderCallbacks<Cursor> //--------------------------------------------------------------------- @Override public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { StringBuilder selection = new StringBuilder(""); ArrayList<String> selectionArgs = new ArrayList<String>(); //Add server profile id and username to WHERE params selection.append(FavoritesTable.ACCOUNT_NAME + " =?"); selectionArgs.add(mProfile.getKey()); //Add filtration to WHERE params selection.append(" AND ("); Iterator<String> iterator = favoritesResourceFilter.getCurrent().getValues().iterator(); while (iterator.hasNext()) { selection.append(FavoritesTable.WSTYPE + " =?"); selectionArgs.add(iterator.next()); if (iterator.hasNext()) { selection.append(" OR "); } } selection.append(")"); //Add sorting type to WHERE params String sortOrderString; if (sortOptions.getOrder() != null && sortOptions.getOrder().getValue().equals(SortOrder.CREATION_DATE.getValue())) { sortOrderString = FavoritesTable.CREATION_TIME + " ASC"; } else { sortOrderString = FavoritesTable.TITLE + " COLLATE NOCASE ASC"; } //Add search query to WHERE params boolean inSearchMode = searchQuery != null; if (inSearchMode) { selection.append(" AND ") .append(FavoritesTable.TITLE + " LIKE ?"); selectionArgs.add("%" + searchQuery + "%"); } StringBuilder sortOrderBuilder = new StringBuilder(""); sortOrderBuilder.append("CASE WHEN ") .append(FavoritesTable.WSTYPE) .append(" LIKE ") .append("'%" + ResourceType.folder + "%'") .append(" THEN 1 ELSE 2 END") .append(", ") .append(sortOrderString); return new CursorLoader(getActivity(), JasperMobileDbProvider.FAVORITES_CONTENT_URI, FavoritesTable.ALL_COLUMNS, selection.toString(), selectionArgs.toArray(new String[selectionArgs.size()]), sortOrderBuilder.toString()); } @Override public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { mAdapter.clear(); mAdapter.addAll(jasperResourceConverter.convertToJasperResource(cursor, FavoritesTable._ID, JasperMobileDbProvider.FAVORITES_CONTENT_URI)); mAdapter.notifyDataSetChanged(); if (cursor.getCount() > 0) { setEmptyText(0); } else { setEmptyText(searchQuery == null ? R.string.f_empty_list_msg : R.string.resources_not_found); } } @Override public void onLoaderReset(Loader<Cursor> cursorLoader) { mAdapter.clear(); mAdapter.notifyDataSetChanged(); } //--------------------------------------------------------------------- // SortDialogFragment.SortDialogClickListener //--------------------------------------------------------------------- @Override public void onOptionSelected(SortOrder sortOrder) { analytics.sendEvent(Analytics.EventCategory.CATALOG.getValue(), Analytics.EventAction.SORTED.getValue(), sortOrder.name()); sortOptions.putOrder(sortOrder); getActivity().getSupportLoaderManager().restartLoader(FAVORITES_LOADER_ID, null, this); } //--------------------------------------------------------------------- // Nested classes //--------------------------------------------------------------------- private class FilterChangeListener implements FilterTitleView.FilterListener { @Override public void onFilter(Filter filter) { analytics.sendEvent(Analytics.EventCategory.CATALOG.getValue(), Analytics.EventAction.FILTERED.getValue(), filter.getName()); favoritesResourceFilter.persist(filter); showFavoritesByFilter(); } } }