/*
* 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.recent.fragment;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
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.domain.SearchResult;
import com.jaspersoft.android.jaspermobile.domain.interactor.resource.SearchResourcesCase;
import com.jaspersoft.android.jaspermobile.network.RequestExceptionHandler;
import com.jaspersoft.android.jaspermobile.ui.view.fragment.BaseFragment;
import com.jaspersoft.android.jaspermobile.util.FavoritesHelper;
import com.jaspersoft.android.jaspermobile.util.ResourceOpener;
import com.jaspersoft.android.jaspermobile.util.ViewType;
import com.jaspersoft.android.jaspermobile.util.filtering.RecentlyViewedResourceFilter;
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.client.oxm.resource.ResourceLookup;
import com.jaspersoft.android.sdk.client.oxm.resource.ResourceLookupSearchCriteria;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.FragmentArg;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.inject.Inject;
import rx.Subscriber;
import timber.log.Timber;
/**
* @author Tom Koptel
* @since 1.9
*/
@EFragment(R.layout.fragment_refreshable_resource)
public class RecentFragment extends BaseFragment
implements SwipeRefreshLayout.OnRefreshListener {
public static final String TAG = RecentFragment.class.getSimpleName();
public static final String ROOT_URI = "/";
protected JasperRecyclerView listView;
protected SwipeRefreshLayout swipeRefreshLayout;
protected TextView emptyText;
@Inject
protected Analytics analytics;
@Inject
protected JasperResourceConverter jasperResourceConverter;
@Inject
protected SearchResourcesCase mSearchResourcesCase;
@Inject
protected FavoritesHelper favoritesHelper;
@FragmentArg
protected ViewType viewType;
@Bean
protected RecentlyViewedResourceFilter recentlyViewedResourceFilter;
@Bean
protected ResourceOpener resourceOpener;
private JasperResourceAdapter mAdapter;
private HashMap<String, ResourceLookup> mResourceLookupHashMap;
private ResourceLookupSearchCriteria mSearchCriteria;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getBaseActivityComponent().inject(this);
mResourceLookupHashMap = new HashMap<>();
mSearchCriteria = new ResourceLookupSearchCriteria();
mSearchCriteria.setLimit(10);
mSearchCriteria.setAccessType("viewed");
mSearchCriteria.setTypes(recentlyViewedResourceFilter.getCurrent().getValues());
mSearchCriteria.setSortBy(SortOrder.ACCESS_TIME.getValue());
mSearchCriteria.setFolderUri(ROOT_URI);
analytics.setScreenName(Analytics.ScreenName.RECENTLY_VIEWED.getValue());
}
@Override
public void onViewCreated(View view, final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
listView = (JasperRecyclerView) view.findViewById(android.R.id.list);
swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refreshLayout);
emptyText = (TextView) view.findViewById(android.R.id.empty);
swipeRefreshLayout.setOnRefreshListener(this);
swipeRefreshLayout.setColorSchemeResources(
R.color.js_blue,
R.color.js_dark_blue,
R.color.js_blue,
R.color.js_dark_blue);
listView.setOnScrollListener(new ScrollListener());
setDataAdapter();
loadResources();
}
@Override
public void onResume() {
super.onResume();
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null) {
actionBar.setTitle(getString(R.string.recent_card_label));
}
List<Analytics.Dimension> viewDimension = new ArrayList<>();
viewDimension.add(new Analytics.Dimension(Analytics.Dimension.RESOURCE_VIEW_HIT_KEY, viewType.name()));
analytics.sendScreenView(Analytics.ScreenName.RECENTLY_VIEWED.getValue(), viewDimension);
}
@Override
public void onPause() {
swipeRefreshLayout.clearAnimation();
super.onPause();
}
@Override
public void onDestroyView() {
mSearchResourcesCase.unsubscribe();
super.onDestroyView();
}
//---------------------------------------------------------------------
// Implements SwipeRefreshLayout.OnRefreshListener
//---------------------------------------------------------------------
@Override
public void onRefresh() {
clearData();
loadResources();
analytics.sendEvent(Analytics.EventCategory.CATALOG.getValue(), Analytics.EventAction.REFRESHED.getValue(), Analytics.EventLabel.RECENTLY_VIEWED.getValue());
}
//---------------------------------------------------------------------
// Helper methods
//---------------------------------------------------------------------
private void clearData() {
mResourceLookupHashMap.clear();
mAdapter.clear();
}
private void addData(List<ResourceLookup> data) {
mResourceLookupHashMap.putAll(jasperResourceConverter.convertToDataMap(data));
mAdapter.addAll(jasperResourceConverter.convertToJasperResource(data));
mAdapter.notifyDataSetChanged();
}
private void onViewSingleClick(ResourceLookup resource) {
resourceOpener.openResource(this, resource);
}
private void setDataAdapter() {
mAdapter = new JasperResourceAdapter(getActivity());
mAdapter.setOnItemInteractionListener(new JasperResourceAdapter.OnResourceInteractionListener() {
@Override
public void onResourceItemClicked(JasperResource jasperResource) {
onViewSingleClick(mResourceLookupHashMap.get(jasperResource.getId()));
}
@Override
public void onSecondaryActionClicked(JasperResource jasperResource) {
ResourceInfoActivity_.intent(getActivity())
.jasperResource(jasperResource)
.start();
}
});
listView.setAdapter(mAdapter);
listView.changeViewType(viewType);
}
private void loadResources() {
setRefreshState(true);
showEmptyText(R.string.loading_msg);
mSearchResourcesCase.execute(mSearchCriteria, new GetResourceLookupsListener());
}
private void showEmptyText(int resId) {
boolean noItems = (mAdapter.getItemCount() > 0);
emptyText.setVisibility(noItems ? View.GONE : View.VISIBLE);
if (resId != 0) emptyText.setText(resId);
}
private void setRefreshState(boolean refreshing) {
if (!refreshing) {
swipeRefreshLayout.setRefreshing(false);
}
}
//---------------------------------------------------------------------
// Inner classes
//---------------------------------------------------------------------
private class GetResourceLookupsListener extends Subscriber<SearchResult> {
@Override
public void onCompleted() {
setRefreshState(false);
}
@Override
public void onError(Throwable e) {
if (!isAdded()) return;
Timber.e(e, "LibraryFragment#GetResourceLookupsListener failed");
RequestExceptionHandler.showAuthErrorIfExists(getActivity(), e);
showEmptyText(R.string.failed_load_data);
setRefreshState(false);
}
@Override
public void onNext(SearchResult searchResult) {
addData(searchResult.getLookups());
setRefreshState(false);
showEmptyText(R.string.resources_not_found);
}
}
//---------------------------------------------------------------------
// Implements AbsListView.OnScrollListener
//---------------------------------------------------------------------
private class ScrollListener extends RecyclerView.OnScrollListener {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
enableRefreshLayout(listView);
}
private void enableRefreshLayout(RecyclerView listView) {
boolean enable = !listView.canScrollVertically(-1);
swipeRefreshLayout.setEnabled(enable);
}
}
}