package what.whatandroid.barcode; import android.content.Context; import android.os.AsyncTask; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.*; import api.barcode.Barcode; import api.search.crossreference.CrossReference; import what.whatandroid.R; import what.whatandroid.callbacks.ViewSearchCallbacks; import what.whatandroid.search.SearchActivity; import java.util.Date; /** * Adapter for displaying the list of user barcodes */ public class BarcodeAdapter extends ArrayAdapter<Barcode> { private final LayoutInflater inflater; private final TextView noBarcodes; private final ViewSearchCallbacks viewSearch; public BarcodeAdapter(Context context, TextView noBarcodes){ super(context, R.layout.list_barcode); inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.noBarcodes = noBarcodes; try { viewSearch = (ViewSearchCallbacks)context; } catch (ClassCastException e){ throw new ClassCastException(context.toString() + " must implement ViewSearchCallbacks"); } } @Override public View getView(int position, View convertView, ViewGroup parent){ final ViewHolder holder; if (convertView != null){ holder = (ViewHolder)convertView.getTag(); } else { convertView = inflater.inflate(R.layout.list_barcode, parent, false); holder = new ViewHolder(); holder.barcodeTitle = (TextView)convertView.findViewById(R.id.barcode_title); holder.barcodeSecondary = (TextView)convertView.findViewById(R.id.barcode_secondary); holder.dateScanned = (TextView)convertView.findViewById(R.id.date_scanned); holder.loadTerms = (ImageButton)convertView.findViewById(R.id.load_terms); holder.loadTerms.setImageResource(R.drawable.ic_file_download_24dp); holder.loadingSpinner = (ProgressBar)convertView.findViewById(R.id.loading_indicator); holder.delete = (ImageButton)convertView.findViewById(R.id.delete); holder.delete.setImageResource(R.drawable.ic_search_24dp); holder.searchTorrents = (Button)convertView.findViewById(R.id.search_torrents); holder.searchTorrents.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_search_24dp, 0); holder.searchRequests = (Button)convertView.findViewById(R.id.search_requests); holder.searchRequests.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_search_24dp, 0); holder.loadTermsListener = new LoadTermsListener(holder); holder.deleteClickListener = new DeleteClickListener(); holder.torrentsListener = new SearchClickListener(SearchActivity.TORRENT); holder.requestsListener = new SearchClickListener(SearchActivity.REQUEST); convertView.setTag(holder); } Barcode b = getItem(position); holder.loadTermsListener.setBarcode(b); holder.dateScanned.setText(DateUtils.getRelativeTimeSpanString(b.getAdded().getTime(), new Date().getTime(), DateUtils.WEEK_IN_MILLIS)); if (!b.getSearchTerms().isEmpty()){ holder.barcodeTitle.setText(b.getSearchTerms()); holder.barcodeSecondary.setText(b.getUpc()); holder.barcodeSecondary.setVisibility(View.VISIBLE); holder.loadTerms.setVisibility(View.GONE); holder.searchTorrents.setVisibility(View.VISIBLE); holder.searchRequests.setVisibility(View.VISIBLE); } else { holder.barcodeTitle.setText(b.getUpc()); holder.barcodeSecondary.setVisibility(View.INVISIBLE); holder.searchTorrents.setVisibility(View.GONE); holder.searchRequests.setVisibility(View.GONE); if (holder.loadingSpinner.getVisibility() != View.VISIBLE){ holder.loadTerms.setVisibility(View.VISIBLE); } else { holder.loadTerms.setVisibility(View.GONE); } } holder.deleteClickListener.setBarcode(b); holder.torrentsListener.setBarcode(b); holder.requestsListener.setBarcode(b); holder.loadTerms.setOnClickListener(holder.loadTermsListener); holder.delete.setOnClickListener(holder.deleteClickListener); holder.searchTorrents.setOnClickListener(holder.torrentsListener); holder.searchRequests.setOnClickListener(holder.requestsListener); return convertView; } private static class ViewHolder { public TextView barcodeTitle, barcodeSecondary, dateScanned; private ImageButton loadTerms, delete; private ProgressBar loadingSpinner; private Button searchTorrents, searchRequests; private LoadTermsListener loadTermsListener; private DeleteClickListener deleteClickListener; private SearchClickListener torrentsListener, requestsListener; } private class DeleteClickListener implements View.OnClickListener { private Barcode barcode; public void setBarcode(Barcode barcode){ this.barcode = barcode; } @Override public void onClick(View v){ remove(barcode); notifyDataSetChanged(); new DeleteBarcodeTask(getContext()).execute(barcode); if (getCount() == 0){ noBarcodes.setVisibility(View.VISIBLE); } } } private class SearchClickListener implements View.OnClickListener { private final int type; private Barcode barcode; public SearchClickListener(int type){ this.type = type; } public void setBarcode(Barcode barcode){ this.barcode = barcode; } @Override public void onClick(View v){ viewSearch.startSearch(type, barcode.getSearchTerms(), barcode.getSearchTags()); } } /** * Listener for the load terms button, will launch an async task to load the * terms for the barcode */ public class LoadTermsListener implements View.OnClickListener { /** * The view holder containing the views to update depending on the loading result */ private ViewHolder holder; /** * Barcode to load terms for */ private Barcode barcode; private LoadTermsTask loadTermsTask; public LoadTermsListener(ViewHolder holder){ this.holder = holder; } public void setBarcode(Barcode barcode){ if (loadTermsTask != null){ holder.loadTerms.setVisibility(View.VISIBLE); holder.loadingSpinner.setVisibility(View.GONE); loadTermsTask.cancel(true); } this.barcode = barcode; } @Override public void onClick(View v){ loadTermsTask = new LoadTermsTask(); loadTermsTask.execute(barcode); } private class LoadTermsTask extends AsyncTask<Barcode, Void, String> { private Barcode b; @Override protected String doInBackground(Barcode... params){ b = params[0]; return CrossReference.termsFromUpc(b.getUpc()); } @Override protected void onPreExecute(){ holder.loadingSpinner.setVisibility(View.VISIBLE); holder.loadTerms.setVisibility(View.GONE); } @Override protected void onPostExecute(String s){ if (s != null && !s.isEmpty()){ b.setSearchTerms(s); holder.barcodeTitle.setText(s); holder.barcodeSecondary.setText(b.getUpc()); holder.searchRequests.setVisibility(View.VISIBLE); holder.searchTorrents.setVisibility(View.VISIBLE); new UpdateBarcodeTask(getContext()).execute(b); } else { holder.barcodeSecondary.setText("No terms found"); } holder.barcodeSecondary.setVisibility(View.VISIBLE); holder.loadingSpinner.setVisibility(View.GONE); } } } }