package se.alexanderblom.delicious.fragments;
import java.io.IOException;
import java.util.List;
import se.alexanderblom.delicious.DeliciousAccount;
import se.alexanderblom.delicious.R;
import se.alexanderblom.delicious.adapter.TagsAdapter;
import se.alexanderblom.delicious.http.Request;
import se.alexanderblom.delicious.http.Response;
import se.alexanderblom.delicious.model.Tag;
import se.alexanderblom.delicious.model.TagsParser;
import se.alexanderblom.delicious.ui.BaseActivity;
import se.alexanderblom.delicious.ui.MainActivity;
import se.alexanderblom.delicious.ui.PostListActivity;
import se.alexanderblom.delicious.util.AsyncLoader;
import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
public class TagListFragment extends ErrorListFragment implements LoaderCallbacks<List<Tag>> {
private static final String TAG = "TagListFragment";
private static final String TAGS_URL = "https://api.del.icio.us/v1/json/tags/get";
private static final int TAGS_LOADER = 1;
private TagsAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new TagsAdapter(getActivity());
setListAdapter(adapter);
setHasOptionsMenu(true);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
BaseActivity activity = (BaseActivity) getActivity();
if (activity.hasAccount()) {
setListShown(false);
getLoaderManager().initLoader(TAGS_LOADER, null, this);
}
}
@Override
public void onStart() {
super.onStart();
Activity activity = getActivity();
activity.setTitle(R.string.page_tags);
if (activity instanceof MainActivity) {
MainActivity main = (MainActivity) activity;
main.setSelectedPage(R.id.page_tags);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_refresh, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_refresh) {
Log.d(TAG, "Refreshing tags");
getLoaderManager().restartLoader(TAGS_LOADER, null, this);
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Tag tag = adapter.getItem(position);
String tagName = tag.getName();
Intent intent = new Intent(getActivity(), PostListActivity.class)
.putExtra(PostListActivity.EXTRA_TAG, tagName);
startActivity(intent);
}
@Override
public Loader<List<Tag>> onCreateLoader(int id, Bundle args) {
setListShown(false);
return new TagsLoader(getActivity(), DeliciousAccount.get(getActivity()), TAGS_URL);
}
@Override
public void onLoadFinished(Loader<List<Tag>> loader, List<Tag> tags) {
if (tags != null) {
adapter.setList(tags);
setListShown(true);
} else {
// There was an error
showLoadingError();
}
}
@Override
public void onLoaderReset(Loader<List<Tag>> loader) {
adapter.clear();
}
@Override
protected void onRetry() {
getLoaderManager().initLoader(TAGS_LOADER, null, this);
}
private void showLoadingError() {
getLoaderManager().destroyLoader(TAGS_LOADER);
showError();
}
private static class TagsLoader extends AsyncLoader<List<Tag>> {
private DeliciousAccount account;
private String url;
public TagsLoader(Context context, DeliciousAccount account, String url) {
super(context);
this.account = account;
this.url = url;
}
@Override
public List<Tag> loadInBackground() {
try {
Response response = Request.get(url)
.addAuth(account)
.execute();
try {
return new TagsParser(response.getReader()).getTags();
} finally {
response.disconnect();
}
} catch (IOException e) {
Log.e(TAG, "Failed to fetch posts", e);
return null;
}
}
}
}