package com.xda.one.ui;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Picasso;
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.RetrofitClient;
import com.xda.one.api.retrofit.RetrofitForumClient;
import com.xda.one.auth.XDAAccount;
import com.xda.one.constants.XDAConstants;
import com.xda.one.event.forum.ForumSubscriptionChangedEvent;
import com.xda.one.event.forum.ForumSubscriptionChangingFailedEvent;
import com.xda.one.loader.ForumLoader;
import com.xda.one.model.misc.ForumType;
import com.xda.one.ui.helper.ActionModeHelper;
import com.xda.one.ui.widget.HierarchySpinnerAdapter;
import com.xda.one.ui.widget.XDARefreshLayout;
import com.xda.one.util.AccountUtils;
import com.xda.one.util.FragmentUtils;
import com.xda.one.util.UIUtils;
import com.xda.one.util.Utils;
import android.content.Intent;
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.MenuItemCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.view.ActionMode;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.ShareActionProvider;
import android.support.v7.widget.XDALinerLayoutManager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ForumFragment extends Fragment
implements LoaderManager.LoaderCallbacks<List<ResponseForum>> {
public static final String FORUM_TYPE = "forum_type";
private static final String PARENT_FORUM_TITLE = "parent_title";
private static final String FORUM_HIERARCHY = "forum_hierarchy";
private static final String FORUM = "forum";
private final EventHandler mEventHandler = new EventHandler();
private HierarchySpinnerAdapter mSpinnerAdapter;
private List<String> mHierarchy;
private String mForumTitle;
private String mParentForumTitle;
private ForumType mForumType = ForumType.ALL;
// Adapter for ListView
private ForumAdapter<Forum> mAdapter;
private XDARefreshLayout mRefreshLayout;
private RecyclerView mRecyclerView;
private ActionModeHelper mModeHelper;
private Forum mForum;
private ForumClient mClient;
public static ForumFragment createInstance(final ForumType forumType) {
final Bundle bundle = new Bundle();
bundle.putSerializable(FORUM_TYPE, forumType);
final ForumFragment fragment = new ForumFragment();
fragment.setArguments(bundle);
return fragment;
}
public static ForumFragment createInstance(final Forum forum, final String parentTitle,
final ArrayList<String> hierarchy) {
final Bundle bundle = new Bundle();
bundle.putSerializable(FORUM_TYPE, ForumType.CHILD);
bundle.putParcelable(FORUM, forum);
bundle.putString(PARENT_FORUM_TITLE, parentTitle);
bundle.putStringArrayList(FORUM_HIERARCHY, hierarchy);
final ForumFragment fragment = new ForumFragment();
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mClient = RetrofitForumClient.getClient(getActivity());
mForumType = (ForumType) getArguments().getSerializable(FORUM_TYPE);
if (mForumType == ForumType.CHILD) {
mForum = getArguments().getParcelable(FORUM);
mForumTitle = mForum.getTitle();
mParentForumTitle = getArguments().getString(PARENT_FORUM_TITLE);
mHierarchy = getArguments().getStringArrayList(FORUM_HIERARCHY);
} else {
mForumTitle = getString(mForumType.getStringTitleId());
mHierarchy = Collections.emptyList();
}
mModeHelper = new ActionModeHelper(getActivity(),
new ForumFragmentActionMode(),
new View.OnClickListener() {
@Override
public void onClick(final View view) {
final int position = mRecyclerView.getChildPosition(view);
if (position == RecyclerView.NO_POSITION) {
return;
}
final Forum responseForum = mAdapter.getForum(position);
onListItemClicked(responseForum);
}
},
ActionModeHelper.SelectionMode.SINGLE);
mSpinnerAdapter = new HierarchySpinnerAdapter(getActivity(),
LayoutInflater.from(getActivity()), mHierarchy, getFragmentManager());
mAdapter = new ForumAdapter<>(getActivity(), mModeHelper, mModeHelper, mModeHelper,
new ForumAdapter.ImageViewDeviceDelegate() {
@Override
public void setupImageViewDevice(ImageView imageView, Forum forum) {
onSetupImageViewListItem(imageView, forum);
}
},
new ForumAdapter.SubscribeButtonDelegate() {
@Override
public void setupSubscribeButton(ImageView subscribeButton,
final Forum forum) {
// Subscribe button
onSetupSubscribeButton(subscribeButton, forum);
}
}
);
}
private void onSetupSubscribeButton(final ImageView subscribeButton, final Forum forum) {
final XDAAccount selectedAccount = AccountUtils.getAccount(getActivity());
if (forum.hasChildren() || selectedAccount == null) {
subscribeButton.setVisibility(View.GONE);
} else {
subscribeButton.setVisibility(View.VISIBLE);
subscribeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
onSubscribeToggleRequested(forum);
}
});
subscribeButton.setImageResource(forum.isSubscribed()
? R.drawable.ic_star_light
: R.drawable.ic_star_outline_light);
}
}
private void onSetupImageViewListItem(final ImageView imageView, final Forum responseForum) {
Picasso.with(getActivity())
.load(responseForum.getImageUrl())
.placeholder(R.drawable.phone)
.error(R.drawable.phone)
.into(imageView);
}
private void onListItemClicked(final Forum forum) {
FragmentUtils.switchToForumContent(getFragmentManager(), getParentFragment(), mHierarchy,
mForumTitle, forum);
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
return inflater.inflate(R.layout.forum_fragment, container, false);
}
@Override
public void onViewCreated(final View view, final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mRecyclerView = (RecyclerView) view.findViewById(android.R.id.list);
mRecyclerView.setLayoutManager(new XDALinerLayoutManager(getActivity()));
mRecyclerView.setAdapter(mAdapter);
ViewCompat.setOverScrollMode(mRecyclerView, ViewCompat.OVER_SCROLL_NEVER);
mRefreshLayout = (XDARefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
mRefreshLayout.setXDAColourScheme();
mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
final Bundle bundle = new Bundle();
bundle.putBoolean(RetrofitClient.FORCE_RELOAD, true);
getLoaderManager().restartLoader(0, bundle, ForumFragment.this);
}
});
mClient.getBus().register(mEventHandler);
mModeHelper.setRecyclerView(mRecyclerView);
final ActionBar actionBar = UIUtils.getSupportActionBar(getActivity());
actionBar.setTitle(mForumTitle);
actionBar.setSubtitle(mParentForumTitle);
if (mForumType == ForumType.CHILD) {
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setListNavigationCallbacks(mSpinnerAdapter, mSpinnerAdapter);
actionBar.setSelectedNavigationItem(mSpinnerAdapter.getCount() - 1);
}
if (mAdapter.getItemCount() == 0) {
getLoaderManager().initLoader(0, null, this);
mRefreshLayout.setRefreshing(true);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
mClient.getBus().unregister(mEventHandler);
}
@Override
public void onDestroy() {
super.onDestroy();
mAdapter = null;
}
@Override
public Loader<List<ResponseForum>> onCreateLoader(final int id, final Bundle bundle) {
boolean forceReload = bundle != null && bundle.getBoolean(RetrofitClient.FORCE_RELOAD,
false);
return new ForumLoader(getActivity(), mForumType, mForum, forceReload);
}
@Override
public void onLoadFinished(final Loader<List<ResponseForum>> loader,
final List<ResponseForum> responseForums) {
// Remove the old data if the adapter is not empty
if (mAdapter.getItemCount() != 0) {
mAdapter.clear();
}
mRefreshLayout.setRefreshing(false);
UIUtils.updateEmptyViewState(getView(), mRecyclerView,
Utils.getCollectionSize(responseForums));
mAdapter.addAll(responseForums);
}
@Override
public void onLoaderReset(final Loader<List<ResponseForum>> loader) {
}
public ForumType getForumType() {
return mForumType;
}
private void onSubscribeToggleRequested(final Forum forum) {
mClient.toggleForumSubscriptionAsync(forum);
}
private class ForumFragmentActionMode
extends ActionModeHelper.RecyclerViewActionModeCallback {
private ShareActionProvider mShareActionProvider;
private MenuItem mShareMenuItem;
private MenuItem mSubscribeItem;
@Override
public boolean onCreateActionMode(final ActionMode actionMode, final Menu menu) {
final BaseActivity baseActivity = UIUtils.getBaseActivity(getActivity());
baseActivity.getMenuInflater().inflate(R.menu.thread_fragment_cab, menu);
// Locate MenuItem with ShareActionProvider
mShareMenuItem = menu.findItem(R.id.forum_fragment_cab_share);
// Fetch and store ShareActionProvider
mShareActionProvider = (ShareActionProvider) MenuItemCompat
.getActionProvider(mShareMenuItem);
// Get the subscribed menu item
mSubscribeItem = menu.findItem(R.id.forum_fragment_cab_subscribe);
return true;
}
@Override
public boolean onPrepareActionMode(final ActionMode actionMode, final Menu menu) {
if (mModeHelper.getCheckedItemCount() == 1) {
updateShareIntent();
final Forum forum = getCheckedForum();
final XDAAccount selectedAccount = AccountUtils.getAccount(getActivity());
final boolean visible = !(forum.hasChildren() || selectedAccount == null);
mSubscribeItem.setVisible(visible);
if (visible) {
final boolean subscribed = forum.isSubscribed();
mSubscribeItem.setIcon(subscribed
? R.drawable.ic_action_star
: R.drawable.ic_action_star_outline);
}
}
return true;
}
private void updateShareIntent() {
final Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, getCheckedForum().getTitle());
sendIntent.putExtra(Intent.EXTRA_TEXT, XDAConstants.XDA_FORUM_URL +
getCheckedForum().getWebUri());
sendIntent.setType("text/plain");
mShareActionProvider.setShareIntent(sendIntent);
}
public Forum getCheckedForum() {
// TODO - fix this ugly hack
return mAdapter.getForum(mModeHelper.getCheckedPositions().get(0));
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.forum_fragment_cab_subscribe:
mClient.toggleForumSubscriptionAsync(getCheckedForum());
break;
}
actionMode.finish();
return true;
}
@Override
public void onCheckedStateChanged(final ActionMode actionMode, final int position,
final boolean isNowChecked) {
actionMode.invalidate();
}
}
private final class EventHandler {
@Subscribe
public void onForumSubscribed(final ForumSubscriptionChangedEvent event) {
// TODO - show a snackbar
if (event.isNowSubscribed) {
Toast.makeText(getActivity(), R.string.forum_subscription_subscribed,
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(), R.string.forum_subscription_unsubscribed,
Toast.LENGTH_LONG).show();
}
// We would need to update the state of the subscribe button now
final int position = mAdapter.indexOf(event.forum);
final Forum forum = mAdapter.getForum(position);
forum.setSubscribed(event.isNowSubscribed);
mAdapter.notifyItemChanged(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();
}
}
}