124 lines
4.4 KiB
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);
|
|
}
|
|
}
|
|
}
|