package it.fdev.unisaconnect;
import it.fdev.scraper.NewsScraper;
import it.fdev.unisaconnect.R;
import it.fdev.utils.CardsAdapter;
import it.fdev.utils.CardsAdapter.CardItem;
import it.fdev.utils.MyListFragment;
import it.fdev.utils.Utils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.view.animation.LayoutAnimationController;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class FragmentNews extends MyListFragment {
private final String NEWS_URL_NEW = "http://unisafeed.appspot.com/readFeed";
private CardsAdapter adapter;
private boolean alreadyStarted = false;
private NewsScraper rssScraper;
private ArrayList<CardItem> cardsList = null;
private TextView listEmptyView;
private ListView listCardsView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adapter = new CardsAdapter(mActivity, R.layout.card_news, new ArrayList<CardItem>());
setListAdapter(adapter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.list_cards_ui, container, false);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
listEmptyView = (TextView) view.findViewById(R.id.card_list_empty);
listCardsView = (ListView) view.findViewById(android.R.id.list);
/* Metto animazione */
LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation(getActivity(), R.anim.list_layout_controller);
/* Indico che la listView di questo ListFragment deve avere il mio controller per l'animazione */
getListView().setLayoutAnimation(controller);
getNews(false);
}
@Override
public void onStop() {
if (rssScraper != null && rssScraper.isRunning) {
rssScraper.cancel(true);
}
super.onStop();
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
try {
String url = cardsList.get(position).getLink();
Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(webIntent);
} catch(Exception e) {
Toast.makeText(mActivity, R.string.problema_aprire_link, Toast.LENGTH_SHORT).show();
Log.w(Utils.TAG, e);
}
}
@Override
public Set<Integer> getActionsToShow() {
Set<Integer> actionsToShow = new HashSet<Integer>();
actionsToShow.add(R.id.action_twitter_button);
actionsToShow.add(R.id.action_refresh_button);
if (!alreadyStarted) {
actionsToShow.add(R.id.action_loading_animation);
}
return actionsToShow;
}
@Override
public void actionRefresh() {
getNews(true);
}
@Override
public void actionTwitter() {
try {
String url = "https://twitter.com/UniSA_news";
Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(webIntent);
} catch(Exception e) {
Log.e(Utils.TAG, "Error opening twitter link", e);
}
}
@Override
public int getTitleResId() {
return R.string.news;
}
public void getNews(boolean force) {
if (!isAdded()) {
return;
}
mActivity.setLoadingVisible(true, true);
listCardsView.setSelectionAfterHeaderView();
if (!force && cardsList != null) {
showCards(null);
mActivity.setLoadingVisible(false, false);
return;
}
if (!Utils.hasConnection(mActivity)) {
Utils.goToInternetError(mActivity, this);
return;
}
alreadyStarted = true;
if (rssScraper != null && rssScraper.isRunning) {
mActivity.setLoadingVisible(true);
return;
}
rssScraper = new NewsScraper(NEWS_URL_NEW);
// rssScraper.setMaxItems(MAX_NEWS_NUMBER);
// rssScraper.setMaxTextLength(MAX_TEXT_LENGTH);
rssScraper.setCallerFragment(this);
rssScraper.execute(mActivity);
return;
}
public void showCards(ArrayList<CardItem> cardsList) {
if (!isAdded()) {
return;
}
if (listEmptyView == null || listCardsView == null) { // Dai report di crash sembra succedere a volte, non ho idea del perchè
mActivity.setDrawerOpen(true); // Quindi mostro lo slidingmenu per apparare
mActivity.setLoadingVisible(false, false);
return;
}
if (cardsList != null) {
this.cardsList = cardsList;
}
if (this.cardsList == null) { // Non ho un menu da mostrare
listEmptyView.setVisibility(View.GONE);
listCardsView.setVisibility(View.GONE);
mActivity.setLoadingVisible(false, false);
return;
} else if (this.cardsList.size() == 0) {
listEmptyView.setVisibility(View.VISIBLE);
listCardsView.setVisibility(View.GONE);
mActivity.setLoadingVisible(false, false);
return;
} else {
listEmptyView.setVisibility(View.GONE);
listCardsView.setVisibility(View.VISIBLE);
}
adapter.clear();
adapter.addAll(cardsList);
adapter.notifyDataSetChanged();
mActivity.setLoadingVisible(false, false);
}
}