package com.xda.one.ui;
import com.xda.one.R;
import com.xda.one.api.inteface.PostClient;
import com.xda.one.api.model.response.container.ResponsePostContainer;
import com.xda.one.api.retrofit.RetrofitPostClient;
import com.xda.one.loader.MentionLoader;
import com.xda.one.model.augmented.AugmentedMention;
import com.xda.one.model.augmented.container.AugmentedMentionContainer;
import com.xda.one.ui.helper.CancellableCallbackHelper;
import com.xda.one.ui.listener.AvatarClickListener;
import com.xda.one.ui.listener.InfiniteRecyclerLoadHelper;
import com.xda.one.util.FragmentUtils;
import com.xda.one.util.UIUtils;
import com.xda.one.util.Utils;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MentionFragment extends QuoteMentionBaseFragment
implements LoaderManager.LoaderCallbacks<AugmentedMentionContainer> {
private static final String PAGES_SAVED_STATE = "pages_saved_state";
private MentionAdapter mAdapter;
private int mTotalPages;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter = new MentionAdapter(getActivity(), new MentionClickListener(),
new AvatarClickListener(getActivity()));
}
@Override
public void onViewCreated(final View view, @Nullable final Bundle state) {
super.onViewCreated(view, state);
mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
UIUtils.updateEmptyViewState(getView(), mRecyclerView, mAdapter.isEmpty());
reloadTheFirstPage();
}
});
mRecyclerView.setAdapter(mAdapter);
if (!mAdapter.isEmpty()) {
return;
}
if (state == null) {
loadTheFirstPage();
} else {
final List<AugmentedMention> mentions = state
.getParcelableArrayList(SAVED_ADAPTER_STATE);
if (Utils.isCollectionEmpty(mentions)) {
loadTheFirstPage();
} else {
// This should give a non-zero integer
mTotalPages = state.getInt(PAGES_SAVED_STATE);
mInfiniteScrollListener = new InfiniteRecyclerLoadHelper(mRecyclerView,
new InfiniteLoadCallback(), mTotalPages, null);
addDataToAdapter(mentions);
}
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
final ArrayList<AugmentedMention> mentions = new ArrayList<>(mAdapter.getMentions());
outState.putParcelableArrayList(MentionFragment.SAVED_ADAPTER_STATE, mentions);
outState.putInt(PAGES_SAVED_STATE, mTotalPages);
}
private void loadTheFirstPage() {
final Bundle bundle = new Bundle();
bundle.putInt(CURRENT_PAGE_LOADER_ARGUMENT, 1);
getLoaderManager().initLoader(0, bundle, this);
}
private void reloadTheFirstPage() {
final Bundle bundle = new Bundle();
bundle.putInt(CURRENT_PAGE_LOADER_ARGUMENT, 1);
getLoaderManager().restartLoader(0, bundle, this);
}
@Override
public Loader<AugmentedMentionContainer> onCreateLoader(int i, Bundle bundle) {
return new MentionLoader(getActivity(), bundle.getInt(CURRENT_PAGE_LOADER_ARGUMENT));
}
@Override
public void onLoadFinished(final Loader<AugmentedMentionContainer> loader,
final AugmentedMentionContainer data) {
if (data == null) {
// TODO - we need to tailor this to lack of connection/other network issue
addDataToAdapter(null);
return;
}
if (mInfiniteScrollListener != null && !mInfiniteScrollListener.isLoading()
&& !mRefreshLayout.isRefreshing()) {
// This may happen when we are coming back from posts fragment to threads. For some
// reason loadFinished gets called. However, we may have new data about the thread -
// don't disturb this data.
UIUtils.updateEmptyViewState(getView(), mRecyclerView, false);
mRecyclerView.setOnScrollListener(mInfiniteScrollListener);
return;
} else if (data.getCurrentPage() == 1 || mInfiniteScrollListener == null) {
mAdapter.clear();
mTotalPages = data.getTotalPages();
mInfiniteScrollListener = new InfiniteRecyclerLoadHelper(mRecyclerView,
new InfiniteLoadCallback(), mTotalPages, null);
}
mInfiniteScrollListener.onLoadFinished();
addDataToAdapter(data.getMentions());
if (!mInfiniteScrollListener.hasMoreData()) {
mAdapter.removeFooter();
}
}
@Override
public void onLoaderReset(Loader<AugmentedMentionContainer> loader) {
}
private void addDataToAdapter(final List<AugmentedMention> data) {
UIUtils.updateEmptyViewState(getView(), mRecyclerView,
data == null ? 0 : data.size());
// Let's actually add the items now
mAdapter.addAll(data);
mRefreshLayout.setRefreshing(false);
}
private class InfiniteLoadCallback implements InfiniteRecyclerLoadHelper.Callback {
@Override
public void loadMoreData(final int page) {
final Bundle bundle = new Bundle();
bundle.putInt(CURRENT_PAGE_LOADER_ARGUMENT, page);
getLoaderManager().restartLoader(0, bundle, MentionFragment.this);
}
}
private class MentionCallback extends CancellableCallbackHelper<ResponsePostContainer> {
private final AlertDialog mDialog;
private final AugmentedMention mMention;
public MentionCallback(final AlertDialog dialog, final AugmentedMention mention) {
super(dialog);
mDialog = dialog;
mMention = mention;
}
@Override
public void safeCallback(final ResponsePostContainer data) {
mDialog.dismiss();
final Fragment fragment = FragmentUtils.switchToPostList(mMention.getThread(),
new ArrayList<String>(), data);
final FragmentTransaction transaction = FragmentUtils.getDefaultTransaction
(getParentFragment().getFragmentManager());
transaction.addToBackStack(mMention.getThread().getTitle());
transaction.replace(R.id.content_frame, fragment).commit();
}
@Override
public void run() {
Toast.makeText(mDialog.getContext(), R.string.something_went_wrong_request,
Toast.LENGTH_LONG).show();
}
}
private class MentionClickListener implements View.OnClickListener {
@Override
public void onClick(final View v) {
final int position = mRecyclerView.getChildPosition(v);
if (position == RecyclerView.NO_POSITION) {
return;
}
final AugmentedMention mention = mAdapter.getMention(position);
final AlertDialog dialog = ProgressDialog.show(getActivity(),
"Finding post position", "Finding post position", true, true);
final MentionCallback mentionCallback = new MentionCallback(dialog, mention);
final PostClient client = RetrofitPostClient.getClient(getActivity());
client.getPostsById(mention.getPostId(), mentionCallback, mentionCallback);
}
}
}