package com.markupartist.iglaset.activity; import java.util.ArrayList; import android.os.AsyncTask; import android.util.Log; import com.markupartist.iglaset.provider.BarcodeStore; import com.markupartist.iglaset.provider.Drink; import com.markupartist.iglaset.provider.DrinksStore; import com.markupartist.iglaset.provider.RatingSearchCriteria; import com.markupartist.iglaset.provider.RecommendationSearchCriteria; import com.markupartist.iglaset.provider.SearchCriteria; /** * Background task to search for drinks. */ public class SearchDrinksTask extends AsyncTask<SearchCriteria, Void, ArrayList<Drink>> { private final static String TAG = SearchDrinksTask.class.getSimpleName(); private SearchDrinkProgressUpdatedListener mSearchDrinkProgressUpdatedListener; private SearchDrinkCompletedListener mSearchDrinkCompletedListener; private SearchDrinkErrorListener mSearchDrinkErrorListener; private Exception mCaughtException; @Override protected ArrayList<Drink> doInBackground(SearchCriteria... params) { publishProgress(); SearchCriteria searchCriteria = params[0]; try { if (searchCriteria.hasBarcode()) { BarcodeStore barcodeStore = BarcodeStore.getInstance(); return barcodeStore.search(searchCriteria); } else if (searchCriteria instanceof RecommendationSearchCriteria) { DrinksStore drinksStore = DrinksStore.getInstance(); return drinksStore.findRecommendations( (RecommendationSearchCriteria) searchCriteria); } else if (searchCriteria instanceof RatingSearchCriteria) { DrinksStore drinksStore = DrinksStore.getInstance(); return drinksStore.findRatedDrinks( (RatingSearchCriteria) searchCriteria); } else { DrinksStore drinksStore = DrinksStore.getInstance(); return drinksStore.searchDrinks(searchCriteria); } } catch (Exception e) { mCaughtException = e; Log.d(TAG, e.toString(), e); } return null; } @Override public void onProgressUpdate(Void... values) { if (mSearchDrinkProgressUpdatedListener != null) { mSearchDrinkProgressUpdatedListener.onSearchDrinkProgress(); } } @Override protected void onPostExecute(ArrayList<Drink> result) { if (mCaughtException == null) { mSearchDrinkCompletedListener.onSearchDrinkComplete(result); } else { mSearchDrinkErrorListener.onSearchDrinkError(mCaughtException); } } /** * Set a listener for progress updated. * @param listener the listener to set */ public void setSearchDrinkProgressUpdatedListener( SearchDrinkProgressUpdatedListener listener) { mSearchDrinkProgressUpdatedListener = listener; } /** * Set a listener for search completed. * @param listener the listener to set */ public void setSearchDrinkCompletedListener( SearchDrinkCompletedListener listener) { mSearchDrinkCompletedListener = listener; } /** * Set listener for errors * @param listener the listener to set */ public void setSearchDrinkErrorListener(SearchDrinkErrorListener listener) { mSearchDrinkErrorListener = listener; } /** * Listener for search progress updated. */ public interface SearchDrinkProgressUpdatedListener { /** * Called when search progress is made. */ public void onSearchDrinkProgress(); } /** * Listener for search completed. */ public interface SearchDrinkCompletedListener { /** * Called when search is completed. * @param result the search result */ public void onSearchDrinkComplete(ArrayList<Drink> result); } /** * Listener for search completed. */ public interface SearchDrinkErrorListener { /** * Called when a search error has occurred. * @param exception exception caught */ public void onSearchDrinkError(Exception exception); } }