package it.fdev.unisaconnect; import it.fdev.scraper.BiblioSearchScraper; import it.fdev.unisaconnect.data.Book; 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.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; 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 FragmentBiblioDoSearch extends MyListFragment { public static final String ARG_URI = "uri"; public static final String BROADCAST_STATUS = "status"; private CardsAdapter adapter; private CardItem moreResultsCard; private boolean alreadyStarted = false; private TextView listEmptyView; private ListView listCardsView; private String mSearchURL; private int searchArgumentJump = 1; ArrayList<CardItem> mCardsList; private IntentFilter mIntentFilter = new IntentFilter(); private final BroadcastReceiver mHandlerBroadcast = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { onNewBroadcast(context, intent); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); adapter = new CardsAdapter(mActivity, R.layout.card_book, 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); mIntentFilter.addAction(BiblioSearchScraper.BROADCAST_STATE_BIBLIO_SEARCH); mActivity.setLoadingVisible(true, true); mSearchURL = getArguments().getString(ARG_URI); if (mSearchURL == null) { return; } listEmptyView = (TextView) view.findViewById(R.id.card_list_empty); listCardsView = (ListView) view.findViewById(android.R.id.list); moreResultsCard = new CardItem("\nMostra altri risultati...\n", "", "", "", false); /* 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); } @Override public void onResume() { super.onResume(); mActivity.registerReceiver(mHandlerBroadcast, mIntentFilter); getLibri(false, true); } @Override public void onPause() { super.onPause(); mActivity.unregisterReceiver(mHandlerBroadcast); } public void onNewBroadcast(Context context, Intent intent) { try { if (BiblioSearchScraper.BROADCAST_STATE_BIBLIO_SEARCH.equals(intent.getAction())) { if (intent.hasExtra(BROADCAST_STATUS)) { ArrayList<Book> list = intent.getParcelableArrayListExtra(BROADCAST_STATUS); if (list != null && !list.isEmpty()) { ArrayList<CardItem> cardsList = new ArrayList<CardsAdapter.CardItem>(); for (Book book : list) { String text = ""; if (!book.getAuthor().isEmpty()) { text += getString(R.string.autore) + ": " + book.getAuthor(); } if (!book.getPosition().isEmpty()) { if (!text.isEmpty()) { text += "\n"; } text += getString(R.string.posizione) + ": " + book.getPosition(); } CardItem cCard = new CardItem(book.getTitle(), book.getDetailsUrl(), text, book.getYear(), false); cardsList.add(cCard); } showLibri(cardsList, false); } else { showLibri(null, false); } } else { showLibri(null, false); } } } catch (Exception e) { Log.e(Utils.TAG, "onReceiveBroadcast exception", e); showLibri(null, false); } } @Override public Set<Integer> getActionsToShow() { Set<Integer> actionsToShow = new HashSet<Integer>(); actionsToShow.add(R.id.action_refresh_button); if (!alreadyStarted || BiblioSearchScraper.isRunning) { actionsToShow.add(R.id.action_loading_animation); } return actionsToShow; } @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); try { if (position == mCardsList.size()) { searchArgumentJump += 10; getLibri(true, false); } else { String url = mCardsList.get(position).getLink(); FragmentBiblioShowBook fragmentShowBook = new FragmentBiblioShowBook(); Bundle args = new Bundle(); args.putString(ARG_URI, url); fragmentShowBook.setArguments(args); mActivity.switchContent(fragmentShowBook); } } catch (Exception e) { Toast.makeText(mActivity, R.string.problema_aprire_link, Toast.LENGTH_SHORT).show(); Log.w(Utils.TAG, e); } } public void getLibri(boolean force, boolean clearList) { if (!isAdded()) { return; } // Lo scraper è in esecuzione if (BiblioSearchScraper.isRunning) { return; } if (clearList) { mActivity.setLoadingVisible(true, true); listCardsView.setSelectionAfterHeaderView(); } else { mActivity.setLoadingVisible(true, false); } if (!force && mCardsList != null) { alreadyStarted = true; showLibri(null, clearList); return; } // Se non c'è internet rimando al fragment di errore if (!Utils.hasConnection(mActivity)) { Utils.goToInternetError(mActivity, this); return; } if (force || !alreadyStarted) { alreadyStarted = true; Log.d(Utils.TAG, "Starting biblio search..."); String newUrl; if (searchArgumentJump > 1) { newUrl = mSearchURL.replace("func=find-b", "func=short-jump"); newUrl += "&jump=" + searchArgumentJump; } else { newUrl = mSearchURL; } // Log.d(Utils.TAG, "newUrl: " + newUrl); Intent searchIntent = new Intent(mActivity, BiblioSearchScraper.class); searchIntent.putExtra(ARG_URI, newUrl); mActivity.startService(searchIntent); } else { listEmptyView.setVisibility(View.VISIBLE); listCardsView.setVisibility(View.GONE); mActivity.setLoadingVisible(false, false); return; } } public void showLibri(ArrayList<CardItem> cardsList, boolean clearList) { 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) { cardsList = new ArrayList<CardsAdapter.CardItem>(); } if (mCardsList == null) { mCardsList = new ArrayList<CardsAdapter.CardItem>(); } if (cardsList.isEmpty()) { if (mCardsList.isEmpty()) { listEmptyView.setVisibility(View.VISIBLE); listCardsView.setVisibility(View.GONE); mActivity.setLoadingVisible(false, false); return; } } else { if (clearList) { mCardsList = cardsList; } else { mCardsList.addAll(cardsList); } } listEmptyView.setVisibility(View.GONE); listCardsView.setVisibility(View.VISIBLE); if (clearList) { adapter.clear(); adapter.addAll(mCardsList); } else { adapter.remove(moreResultsCard); if (cardsList.isEmpty()) { } adapter.addAll(cardsList); } adapter.add(moreResultsCard); adapter.notifyDataSetChanged(); mActivity.setLoadingVisible(false, false); } @Override public void actionRefresh() { super.actionRefresh(); getLibri(true, true); } @Override public int getTitleResId() { return R.string.risultati_ricerca; } }