package pro.dbro.glance.fragments;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.parse.Parse;
import com.parse.ParseObject;
import com.parse.ParseQueryAdapter;
import java.net.MalformedURLException;
import java.net.URL;
import pro.dbro.glance.adapters.AdapterUtils;
import pro.dbro.glance.R;
import pro.dbro.glance.SECRETS;
import pro.dbro.glance.adapters.ArticleAdapter;
import pro.dbro.glance.adapters.ReaderSectionAdapter;
import pro.dbro.glance.lib.SpritzerTextView;
public class FeedFragment extends ListFragment {
ArrayAdapter<JsonObject> mFeedItemAdapter;
ParseQueryAdapter<ParseObject> mArticleAdapter;
// ProgressBar mLoadingView;
SpritzerTextView mLoadingView;
// This "Future" tracks loading operations.
Future<JsonObject> mFuture;
private static final String ARG_FEED = "feed";
private ReaderSectionAdapter.Feed mFeed;
private static boolean sParseSetup = false;
private boolean mLoading = false;
public static FeedFragment newInstance(ReaderSectionAdapter.Feed feed) {
FeedFragment f = new FeedFragment();
Bundle b = new Bundle();
b.putSerializable(ARG_FEED, feed);
f.setArguments(b);
return f;
}
public void setupParse() {
Parse.initialize(this.getActivity(), SECRETS.getParseId(), SECRETS.getParseSecret());
sParseSetup = true;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFeed = (ReaderSectionAdapter.Feed) getArguments().getSerializable(ARG_FEED);
if (!sParseSetup) {
setupParse();
}
}
public void onResume() {
super.onResume();
if (mLoading) showLoading();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View myFragmentView = inflater.inflate(R.layout.fragment_list, container, false);
ListView listView = (ListView) myFragmentView.findViewById(android.R.id.list);
// mLoadingView = (ProgressBar) myFragmentView.findViewById(android.R.id.empty);
mLoadingView = (SpritzerTextView) myFragmentView.findViewById(android.R.id.empty);
switch (mFeed) {
case POPULAR:
mArticleAdapter = new ArticleAdapter(getActivity(), ArticleAdapter.ArticleFilter.RECENT);
listView.setAdapter(mArticleAdapter);
break;
case RECENT:
mArticleAdapter = new ArticleAdapter(getActivity(), ArticleAdapter.ArticleFilter.ALL);
listView.setAdapter(mArticleAdapter);
break;
default:
mFeedItemAdapter = createFeedAdapter();
listView.setAdapter(mFeedItemAdapter);
loadPipe(mFeed.getFeedUrl());
break;
}
return myFragmentView;
}
// Create adapters from items coming from Pipes.
private ArrayAdapter<JsonObject> createFeedAdapter() {
return new ArrayAdapter<JsonObject>(getActivity(), 0) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getActivity().getLayoutInflater().inflate(R.layout.article_list_item, null);
}
JsonObject post = getItem(position);
try {
String title = post.get("title").getAsString();
TextView handle = (TextView) convertView.findViewById(R.id.title);
handle.setText(title);
TextView text = (TextView) convertView.findViewById(R.id.url);
convertView.setTag((post.get("link").getAsString()));
try {
text.setText(new URL(post.get("link").getAsString()).getHost());
} catch (MalformedURLException e) {
text.setText(post.get("link").getAsString());
}
convertView.setOnClickListener(AdapterUtils.getArticleClickListener(convertView.getContext()));
} catch (Exception e) {
// Parsing is fucked. NSFO.
}
return convertView;
}
};
}
private void loadPipe(String url) {
// don't attempt to load more if a load is already in progress
if (mFuture != null && !mFuture.isDone() && !mFuture.isCancelled())
return;
mLoading = true;
// This request loads a URL as JsonArray and invokes
// a callback on completion.
mFuture = Ion.with(getActivity(), url)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
mLoading = false;
// this is called back onto the ui thread, no Activity.runOnUiThread or Handler.post necessary.
if (e != null) {
showError();
e.printStackTrace();
return;
}
JsonObject value = result.getAsJsonObject("value");
JsonArray results = value.getAsJsonArray("items");
if (results.size() == 0) {
showError();
return;
}
for (int i = 0; i < results.size(); i++) {
mFeedItemAdapter.add(results.get(i).getAsJsonObject());
}
}
});
// Replace network fetch code with this to simulate network error
// mLoadingView.postDelayed(new Runnable() {
// @Override
// public void run() {
// mLoading = false;
// showError();
// }
// }, 6000);
}
private void showError() {
mLoadingView.getSpritzer().pause();
mLoadingView.getSpritzer().setLoopingPlayback(true);
mLoadingView.getSpritzer().setWpm(200);
mLoadingView.getSpritzer().setTextAndStart(getString(R.string.spritz_error), false);
}
private void showLoading() {
mLoadingView.getSpritzer().pause();
mLoadingView.getSpritzer().setLoopingPlayback(true);
mLoadingView.getSpritzer().setWpm(400);
mLoadingView.getSpritzer().setTextAndStart(getString(R.string.spritz_loading), false);
}
}