session-android/src/org/thoughtcrime/securesms/giph/ui/GiphyFragment.java

124 lines
4.4 KiB
Java

package org.thoughtcrime.securesms.giph.ui;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.giph.model.GiphyImage;
import org.thoughtcrime.securesms.giph.net.GiphyLoader;
import org.thoughtcrime.securesms.giph.util.InfiniteScrollListener;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.LinkedList;
import java.util.List;
public abstract class GiphyFragment extends Fragment implements LoaderManager.LoaderCallbacks<List<GiphyImage>>, GiphyAdapter.OnItemClickListener {
private static final String TAG = GiphyFragment.class.getSimpleName();
private GiphyAdapter giphyAdapter;
private RecyclerView recyclerView;
private ProgressBar loadingProgress;
private TextView noResultsView;
private GiphyAdapter.OnItemClickListener listener;
protected String searchString;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) {
ViewGroup container = ViewUtil.inflate(inflater, viewGroup, R.layout.giphy_fragment);
this.recyclerView = ViewUtil.findById(container, R.id.giphy_list);
this.loadingProgress = ViewUtil.findById(container, R.id.loading_progress);
this.noResultsView = ViewUtil.findById(container, R.id.no_results);
return container;
}
@Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
this.giphyAdapter = new GiphyAdapter(getActivity(), new LinkedList<GiphyImage>());
this.giphyAdapter.setListener(this);
this.recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
this.recyclerView.setItemAnimator(new DefaultItemAnimator());
this.recyclerView.setAdapter(giphyAdapter);
this.recyclerView.addOnScrollListener(new GiphyScrollListener());
getLoaderManager().initLoader(0, null, this);
}
@Override
public void onLoadFinished(Loader<List<GiphyImage>> loader, @NonNull List<GiphyImage> data) {
this.loadingProgress.setVisibility(View.GONE);
if (data.isEmpty()) noResultsView.setVisibility(View.VISIBLE);
else noResultsView.setVisibility(View.GONE);
this.giphyAdapter.setImages(data);
}
@Override
public void onLoaderReset(Loader<List<GiphyImage>> loader) {
noResultsView.setVisibility(View.GONE);
this.giphyAdapter.setImages(new LinkedList<GiphyImage>());
}
public void setLayoutManager(int type) {
if (type == GiphyActivityToolbar.OnLayoutChangedListener.LAYOUT_GRID) {
this.recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
} else {
this.recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
}
}
public void setClickListener(GiphyAdapter.OnItemClickListener listener) {
this.listener = listener;
}
public void setSearchString(@Nullable String searchString) {
this.searchString = searchString;
this.noResultsView.setVisibility(View.GONE);
this.getLoaderManager().restartLoader(0, null, this);
}
@Override
public void onClick(GiphyAdapter.GiphyViewHolder viewHolder) {
if (listener != null) listener.onClick(viewHolder);
}
private class GiphyScrollListener extends InfiniteScrollListener {
@Override
public void onLoadMore(final int currentPage) {
final Loader<List<GiphyImage>> loader = getLoaderManager().getLoader(0);
if (loader == null) return;
new AsyncTask<Void, Void, List<GiphyImage>>() {
@Override
protected List<GiphyImage> doInBackground(Void... params) {
return ((GiphyLoader)loader).loadPage(currentPage * GiphyLoader.PAGE_SIZE);
}
protected void onPostExecute(List<GiphyImage> images) {
giphyAdapter.addImages(images);
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
}