package hk.reality.stock.service.searcher; import hk.reality.stock.PortfolioActivity; import hk.reality.stock.R; import hk.reality.stock.StockApplication; import hk.reality.stock.model.Portfolio; import hk.reality.stock.model.Stock; import hk.reality.stock.service.Lang; import hk.reality.stock.service.exception.DownloadException; import hk.reality.stock.service.exception.ParseException; import hk.reality.utils.NetworkDetector; import java.util.List; import org.apache.commons.lang.Validate; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; public class StockSearchTask extends AsyncTask<String, Void, Stock> { private static final String TAG = "StockSearchTask"; private Error error; private PortfolioActivity activity; enum Error { ERROR_NO_NET, ERROR_DOWNLOAD, ERROR_PARSE, ERROR_UNKNOWN } public StockSearchTask(PortfolioActivity activity) { this.activity = activity; } @Override protected Stock doInBackground(String... params) { Validate.notNull(params, "params cannot be null"); Validate.notNull(params[0], "lang cannot be null"); Validate.notNull(params[1], "quote cannot be null"); String lang = params[0]; String quote = params[1]; if (!NetworkDetector.hasValidNetwork(activity)) { error = Error.ERROR_NO_NET; return null; } try { StockSearcher searcher = new HkexStockSearcher(Lang.valueOf(lang)); return searcher.searchStock(quote); } catch (DownloadException de) { Log.e(TAG, "error downloading stock info", de); error = Error.ERROR_DOWNLOAD; } catch (ParseException pe) { Log.e(TAG, "error parsing stock info", pe); error = Error.ERROR_PARSE; } catch (RuntimeException ue) { Log.e(TAG, "error parsing stock info", ue); error = Error.ERROR_UNKNOWN; } return null; } @Override protected void onPreExecute() { activity.showDialog(PortfolioActivity.DIALOG_ADD_IN_PROGRESS); } @Override protected void onPostExecute(Stock result) { activity.dismissDialog(PortfolioActivity.DIALOG_ADD_IN_PROGRESS); if (result != null) { Portfolio portfolio = StockApplication.getCurrentPortfolio(); List<Stock> stocks = portfolio.getStocks(); if (stocks.contains(result)) { Toast.makeText(activity, R.string.msg_stock_existed, Toast.LENGTH_LONG).show(); } else { stocks.add(result); StockApplication.getPortfolioService().update(portfolio); activity.refreshStockList(); Toast.makeText(activity, R.string.msg_stock_added, Toast.LENGTH_LONG).show(); } activity.updateStocks(); } else { switch (error) { case ERROR_NO_NET: Toast.makeText(activity, R.string.msg_no_network, Toast.LENGTH_LONG).show(); break; case ERROR_DOWNLOAD: activity.showDialog(PortfolioActivity.DIALOG_ERR_DOWNLOAD_PORTFOLIO); break; case ERROR_PARSE: activity.showDialog(PortfolioActivity.DIALOG_ERR_QUOTE); break; case ERROR_UNKNOWN: activity.showDialog(PortfolioActivity.DIALOG_ERR_UNEXPECTED); break; default: break; } } } }