package org.wordpress.android.ui.reader;
import android.app.Fragment;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.wordpress.android.R;
import org.wordpress.android.models.ReaderBlog;
import org.wordpress.android.models.ReaderRecommendedBlog;
import org.wordpress.android.ui.reader.adapters.ReaderBlogAdapter;
import org.wordpress.android.ui.reader.adapters.ReaderBlogAdapter.ReaderBlogType;
import org.wordpress.android.ui.reader.views.ReaderRecyclerView;
import org.wordpress.android.util.AppLog;
/*
* fragment hosted by ReaderSubsActivity which shows either recommended blogs and followed blogs
*/
public class ReaderBlogFragment extends Fragment
implements ReaderBlogAdapter.BlogClickListener {
private ReaderRecyclerView mRecyclerView;
private ReaderBlogAdapter mAdapter;
private ReaderBlogType mBlogType;
private String mSearchFilter;
private boolean mIgnoreNextSearch;
private static final String ARG_BLOG_TYPE = "blog_type";
private static final String KEY_SEARCH_FILTER = "search_filter";
static ReaderBlogFragment newInstance(ReaderBlogType blogType) {
AppLog.d(AppLog.T.READER, "reader blog fragment > newInstance");
Bundle args = new Bundle();
args.putSerializable(ARG_BLOG_TYPE, blogType);
ReaderBlogFragment fragment = new ReaderBlogFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
restoreState(args);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
AppLog.d(AppLog.T.READER, "reader blog fragment > restoring instance state");
mIgnoreNextSearch = true;
restoreState(savedInstanceState);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.reader_fragment_list, container, false);
mRecyclerView = (ReaderRecyclerView) view.findViewById(R.id.recycler_view);
// options menu (with search) only appears for followed blogs
setHasOptionsMenu(getBlogType() == ReaderBlogType.FOLLOWED);
return view;
}
private void checkEmptyView() {
if (!isAdded()) return;
TextView emptyView = (TextView) getView().findViewById(R.id.text_empty);
if (emptyView == null) return;
boolean isEmpty = hasBlogAdapter() && getBlogAdapter().isEmpty();
if (isEmpty) {
switch (getBlogType()) {
case RECOMMENDED:
emptyView.setText(R.string.reader_empty_recommended_blogs);
break;
case FOLLOWED:
if (getBlogAdapter().hasSearchFilter()) {
emptyView.setText(R.string.reader_empty_followed_blogs_search_title);
} else {
emptyView.setText(R.string.reader_empty_followed_blogs_title);
}
break;
}
}
emptyView.setVisibility(isEmpty ? View.VISIBLE : View.GONE);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mRecyclerView.setAdapter(getBlogAdapter());
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putSerializable(ARG_BLOG_TYPE, getBlogType());
if (getBlogAdapter().hasSearchFilter()) {
outState.putString(KEY_SEARCH_FILTER, getBlogAdapter().getSearchFilter());
}
super.onSaveInstanceState(outState);
}
private void restoreState(Bundle args) {
if (args != null) {
if (args.containsKey(ARG_BLOG_TYPE)) {
mBlogType = (ReaderBlogType) args.getSerializable(ARG_BLOG_TYPE);
}
if (args.containsKey(KEY_SEARCH_FILTER)) {
mSearchFilter = args.getString(KEY_SEARCH_FILTER);
}
}
}
@Override
public void onResume() {
super.onResume();
refresh();
}
/*
* note this will only be called for followed blogs
*/
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.reader_subs, menu);
MenuItem searchMenu = menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView) searchMenu.getActionView();
searchView.setQueryHint(getString(R.string.reader_hint_search_followed_sites));
MenuItemCompat.setOnActionExpandListener(searchMenu, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
setSearchFilter(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// when the fragment is recreated this will be called with an empty query
// string, causing the existing search query to be lost - work around this
// by ignoring the next search performed after recreation
if (mIgnoreNextSearch) {
mIgnoreNextSearch = false;
AppLog.i(AppLog.T.READER, "reader subs > ignoring search");
} else {
setSearchFilter(newText);
}
return false;
}
});
// make sure the search view is expanded and reflects the current filter
if (!TextUtils.isEmpty(mSearchFilter)) {
searchMenu.expandActionView();
searchView.clearFocus();
searchView.setQuery(mSearchFilter, false);
}
}
void refresh() {
if (hasBlogAdapter()) {
AppLog.d(AppLog.T.READER, "reader subs > refreshing blog fragment " + getBlogType().name());
getBlogAdapter().refresh();
}
}
private void setSearchFilter(String constraint) {
mSearchFilter = constraint;
getBlogAdapter().setSearchFilter(constraint);
}
private boolean hasBlogAdapter() {
return (mAdapter != null);
}
private ReaderBlogAdapter getBlogAdapter() {
if (mAdapter == null) {
mAdapter = new ReaderBlogAdapter(getBlogType(), mSearchFilter);
mAdapter.setBlogClickListener(this);
mAdapter.setDataLoadedListener(new ReaderInterfaces.DataLoadedListener() {
@Override
public void onDataLoaded(boolean isEmpty) {
checkEmptyView();
}
});
}
return mAdapter;
}
public ReaderBlogType getBlogType() {
return mBlogType;
}
@Override
public void onBlogClicked(Object item) {
long blogId;
long feedId;
if (item instanceof ReaderRecommendedBlog) {
ReaderRecommendedBlog blog = (ReaderRecommendedBlog) item;
blogId = blog.blogId;
feedId = 0;
} else if (item instanceof ReaderBlog) {
ReaderBlog blog = (ReaderBlog) item;
blogId = blog.blogId;
feedId = blog.feedId;
} else {
return;
}
if (feedId != 0) {
ReaderActivityLauncher.showReaderFeedPreview(getActivity(), feedId);
} else if (blogId != 0) {
ReaderActivityLauncher.showReaderBlogPreview(getActivity(), blogId);
}
}
}