/* * Created by Angel Leon (@gubatron), Alden Torres (aldenml) * Copyright (c) 2011-2013, FrostWire(R). All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.bt.download.android.gui.adapters; import com.bt.download.android.R; import com.bt.download.android.core.Constants; import com.bt.download.android.core.MediaType; import com.bt.download.android.gui.util.UIUtils; import com.bt.download.android.gui.views.AbstractListAdapter; import com.bt.download.android.util.ImageUtils; import com.frostwire.licences.License; import com.frostwire.search.FileSearchResult; import com.frostwire.search.SearchResult; import com.frostwire.search.appia.AppiaSearchResult; import com.frostwire.search.torrent.TorrentSearchResult; import com.frostwire.search.youtube.YouTubeCrawledSearchResult; import com.frostwire.uxstats.UXAction; import com.frostwire.uxstats.UXStats; import org.apache.commons.io.FilenameUtils; import android.content.Context; import android.graphics.Paint; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * @author gubatron * @author aldenml * */ public class SearchResultListAdapter extends AbstractListAdapter<SearchResult> { private static final int NO_FILE_TYPE = -1; private final OnLinkClickListener linkListener; private int fileType; public SearchResultListAdapter(Context context) { super(context, R.layout.view_bittorrent_search_result_list_item); this.linkListener = new OnLinkClickListener(); this.fileType = NO_FILE_TYPE; } public int getFileType() { return fileType; } public void setFileType(int fileType) { this.fileType = fileType; filter(); } public void addResults(List<? extends SearchResult> completeList, List<? extends SearchResult> filteredList) { visualList.addAll(filteredList); // java, java, and type erasure list.addAll(completeList); notifyDataSetChanged(); } @Override protected void populateView(View view, SearchResult sr) { if (sr instanceof FileSearchResult) { populateFilePart(view, (FileSearchResult) sr); } if (sr instanceof TorrentSearchResult) { populateTorrentPart(view, (TorrentSearchResult) sr); } if (sr instanceof YouTubeCrawledSearchResult) { populateYouTubePart(view, (YouTubeCrawledSearchResult) sr); } if (sr instanceof AppiaSearchResult) { populateAppiaPart(view, (AppiaSearchResult) sr); } populateThumbnail(view, sr); } protected void populateFilePart(View view, FileSearchResult sr) { ImageView fileTypeIcon = findView(view, R.id.view_bittorrent_search_result_list_item_filetype_icon); fileTypeIcon.setImageResource(getFileTypeIconId()); TextView adIndicator = findView(view, R.id.view_bittorrent_search_result_list_item_ad_indicator); adIndicator.setVisibility(View.GONE); TextView title = findView(view, R.id.view_bittorrent_search_result_list_item_title); title.setText(sr.getDisplayName()); // if marked as downloading // title.setTextColor(GlobalConstants.COLOR_DARK_BLUE); TextView fileSize = findView(view, R.id.view_bittorrent_search_result_list_item_file_size); if (sr.getSize() > 0) { fileSize.setText(UIUtils.getBytesInHuman(sr.getSize())); } else { fileSize.setText(""); } TextView extra = findView(view, R.id.view_bittorrent_search_result_list_item_text_extra); extra.setText(FilenameUtils.getExtension(sr.getFilename())); TextView seeds = findView(view, R.id.view_bittorrent_search_result_list_item_text_seeds); seeds.setText(""); String license = sr.getLicense().equals(License.UNKNOWN) ? "" : " - " + sr.getLicense(); TextView sourceLink = findView(view, R.id.view_bittorrent_search_result_list_item_text_source); sourceLink.setText(sr.getSource() + license); // TODO: ask for design sourceLink.setTag(sr.getDetailsUrl()); sourceLink.setPaintFlags(sourceLink.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); sourceLink.setOnClickListener(linkListener); } private void populateThumbnail(View view, SearchResult sr) { if (sr.getThumbnailUrl() != null) { ImageView fileTypeIcon = findView(view, R.id.view_bittorrent_search_result_list_item_filetype_icon); ImageUtils.load(sr.getThumbnailUrl(), fileTypeIcon, getFileTypeIconId()); } } protected void populateYouTubePart(View view, YouTubeCrawledSearchResult sr) { TextView extra = findView(view, R.id.view_bittorrent_search_result_list_item_text_extra); extra.setText(FilenameUtils.getExtension(sr.getFilename())); } protected void populateTorrentPart(View view, TorrentSearchResult sr) { TextView seeds = findView(view, R.id.view_bittorrent_search_result_list_item_text_seeds); if (sr.getSeeds() > 0) { seeds.setText(getContext().getResources().getQuantityString(R.plurals.count_seeds_source, sr.getSeeds(), sr.getSeeds())); } else { seeds.setText(""); } } protected void populateAppiaPart(View view, AppiaSearchResult sr) { TextView adIndicator = findView(view, R.id.view_bittorrent_search_result_list_item_ad_indicator); adIndicator.setVisibility(View.VISIBLE); TextView extra = findView(view, R.id.view_bittorrent_search_result_list_item_text_extra); extra.setText(sr.getCategoryName() + " : " + sr.getDescription()); //TextView seeds = findView(view, R.id.view_bittorrent_search_result_list_item_text_seeds); //String license = sr.getLicense().equals(License.UNKNOWN) ? "" : " - " + sr.getLicense(); TextView sourceLink = findView(view, R.id.view_bittorrent_search_result_list_item_text_source); sourceLink.setText(sr.getSource()); sourceLink.setTag(sr.getDetailsUrl()); sourceLink.setPaintFlags(sourceLink.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); sourceLink.setOnClickListener(linkListener); } @Override protected void onItemClicked(View v) { SearchResult sr = (SearchResult) v.getTag(); if (sr instanceof AppiaSearchResult) { onAppiaSearchResultClicked((AppiaSearchResult) sr); } else { searchResultClicked(sr); } } protected void searchResultClicked(SearchResult sr) { } protected void onAppiaSearchResultClicked(AppiaSearchResult sr) { UIUtils.openURL(this.getContext(), sr.getDetailsUrl()); } private void filter() { this.visualList = filter(list).filtered; notifyDataSetInvalidated(); } public FilteredSearchResults filter(List<SearchResult> results) { FilteredSearchResults fsr = new FilteredSearchResults(); ArrayList<SearchResult> l = new ArrayList<SearchResult>(); for (SearchResult sr : results) { MediaType mt = null; if (sr instanceof AppiaSearchResult) { mt = ((AppiaSearchResult) sr).getMediaType(); } else { mt = MediaType.getMediaTypeForExtension(FilenameUtils.getExtension(((FileSearchResult) sr).getFilename())); } if (accept(sr, mt)) { l.add(sr); } fsr.increment(mt); } fsr.filtered = l; return fsr; } private boolean accept(SearchResult sr, MediaType mt) { if (sr instanceof FileSearchResult || sr instanceof AppiaSearchResult) { if (mt == null) { return false; } return mt.getId() == fileType; } else { return false; } } private int getFileTypeIconId() { switch (fileType) { case Constants.FILE_TYPE_APPLICATIONS: return R.drawable.browse_peer_application_icon_selector_menu; case Constants.FILE_TYPE_AUDIO: return R.drawable.browse_peer_audio_icon_selector_menu; case Constants.FILE_TYPE_DOCUMENTS: return R.drawable.browse_peer_document_icon_selector_menu; case Constants.FILE_TYPE_PICTURES: return R.drawable.browse_peer_picture_icon_selector_menu; case Constants.FILE_TYPE_VIDEOS: return R.drawable.browse_peer_video_icon_selector_menu; case Constants.FILE_TYPE_TORRENTS: return R.drawable.browse_peer_torrent_icon_selector_menu; default: return R.drawable.question_mark; } } private static class OnLinkClickListener implements OnClickListener { @Override public void onClick(View v) { String url = (String) v.getTag(); UIUtils.openURL(v.getContext(), url); UXStats.instance().log(UXAction.SEARCH_RESULT_SOURCE_VIEW); } } public static class FilteredSearchResults { public List<SearchResult> filtered; public int numAudio; public int numVideo; public int numPictures; public int numApplications; public int numDocuments; public int numTorrents; private void increment(MediaType mt) { if (mt != null) { switch (mt.getId()) { case Constants.FILE_TYPE_AUDIO: numAudio++; break; case Constants.FILE_TYPE_VIDEOS: numVideo++; break; case Constants.FILE_TYPE_PICTURES: numPictures++; break; case Constants.FILE_TYPE_APPLICATIONS: numApplications++; break; case Constants.FILE_TYPE_DOCUMENTS: numDocuments++; break; case Constants.FILE_TYPE_TORRENTS: numTorrents++; break; } } } } }