package com.xda.one.ui;
import com.squareup.otto.Subscribe;
import com.xda.one.R;
import com.xda.one.api.inteface.ForumClient;
import com.xda.one.api.model.interfaces.Forum;
import com.xda.one.api.model.response.ResponseForum;
import com.xda.one.api.retrofit.RetrofitForumClient;
import com.xda.one.event.forum.ForumSubscriptionChangedEvent;
import com.xda.one.event.forum.ForumSubscriptionChangingFailedEvent;
import com.xda.one.loader.SubscribedForumLoader;
import com.xda.one.ui.widget.XDARefreshLayout;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import static com.xda.one.util.UIUtils.updateEmptyViewState;
public class SubscribedForumFragment extends Fragment
implements LoaderManager.LoaderCallbacks<List<ResponseForum>> {
private static final int FORUM_LOADER = 1;
private final EventHandler mEventHandler = new EventHandler();
private Callback mCallback;
private RecyclerView mRecyclerView;
private ForumAdapter<Forum> mAdapter;
private XDARefreshLayout mRefreshLayout;
private ForumClient mForumClient;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallback = (Callback) getParentFragment();
} catch (ClassCastException ex) {
ex.printStackTrace();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mForumClient = RetrofitForumClient.getClient(getActivity());
mAdapter = new ForumAdapter<>(getActivity(), new View.OnClickListener() {
@Override
public void onClick(final View view) {
final int position = mRecyclerView.getChildPosition(view);
switchToThreadFragment(position);
}
}, null, null, new ForumAdapter.ImageViewDeviceDelegate() {
@Override
public void setupImageViewDevice(ImageView imageView, Forum forum) {
// Simply do nothing - we don't need to load images here
}
}, new ForumAdapter.SubscribeButtonDelegate() {
@Override
public void setupSubscribeButton(final ImageView subscribeButton,
final Forum forum) {
subscribeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
unsubscribeRequested(forum);
updateEmptyViewState(getView(), mRecyclerView, mAdapter.getItemCount());
}
});
}
});
}
private void unsubscribeRequested(final Forum forum) {
mForumClient.unsubscribeAsync(forum);
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
return inflater.inflate(R.layout.subscribed_forum_fragment, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mForumClient.getBus().register(mEventHandler);
mRefreshLayout = (XDARefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
mRefreshLayout.setXDAColourScheme();
mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
getLoaderManager().restartLoader(0, null, SubscribedForumFragment.this);
}
});
mRecyclerView = (RecyclerView) view.findViewById(android.R.id.list);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
ViewCompat.setOverScrollMode(mRecyclerView, ViewCompat.OVER_SCROLL_NEVER);
if (mAdapter.getItemCount() == 0) {
mRefreshLayout.setRefreshing(true);
getLoaderManager().initLoader(FORUM_LOADER, /* bundle */ null, this);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
mForumClient.getBus().unregister(mEventHandler);
}
private void switchToThreadFragment(final int position) {
final Forum forum = mAdapter.getForum(position);
final ArrayList<String> hierarchy = new ArrayList<>();
hierarchy.add(forum.getTitle());
final Fragment fragment = ThreadFragment.createDefault(forum.getForumId(),
forum.getTitle(), /* parentForum */ null, hierarchy);
mCallback.switchCurrentlyDisplayedFragment(fragment, true, forum.getTitle());
}
@Override
public Loader<List<ResponseForum>> onCreateLoader(int id, Bundle args) {
return new SubscribedForumLoader(getActivity());
}
@Override
public void onLoadFinished(final Loader<List<ResponseForum>> loader,
final List<ResponseForum> list) {
// Remove the list if the adapter is not empty
if (!mAdapter.isEmpty()) {
mAdapter.clear();
}
mRefreshLayout.setRefreshing(false);
updateEmptyViewState(getView(), mRecyclerView, list == null ? 0 : list.size());
mAdapter.addAll(list);
}
@Override
public void onLoaderReset(Loader<List<ResponseForum>> loader) {
}
public interface Callback {
public void switchCurrentlyDisplayedFragment(final Fragment fragment,
final boolean backStackAndAnimate, final String backstackTitle);
}
public class EventHandler {
@Subscribe
public void onUnsubscribed(final ForumSubscriptionChangedEvent event) {
Toast.makeText(getActivity(), R.string.forum_subscription_unsubscribed,
Toast.LENGTH_LONG).show();
final int position = mAdapter.indexOf(event.forum);
mAdapter.remove(position);
}
@Subscribe
public void onForumSubscribingFailed(final ForumSubscriptionChangingFailedEvent event) {
// TODO - show a snackbar
Toast.makeText(getActivity(), R.string.forum_subscription_toggle_failed,
Toast.LENGTH_LONG).show();
}
}
}