package org.wikipedia.page; import android.content.Context; import android.support.annotation.NonNull; import android.support.v4.util.LruCache; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import org.apache.commons.lang3.StringUtils; import org.wikipedia.R; import org.wikipedia.WikipediaApp; import org.wikipedia.dataclient.WikiSite; import org.wikipedia.dataclient.mwapi.MwQueryPage; import org.wikipedia.dataclient.mwapi.MwQueryResponse; import org.wikipedia.pageimages.PageImage; import org.wikipedia.pageimages.PageImagesClient; import org.wikipedia.views.GoneIfEmptyTextView; import org.wikipedia.views.ViewUtil; import org.wikipedia.wikidata.GetDescriptionsClient; import java.util.ArrayList; import java.util.List; import java.util.Map; import retrofit2.Call; /** * ListAdapter for disambiguation items. */ class DisambigListAdapter extends ArrayAdapter<DisambigResult> { private static final int MAX_CACHE_SIZE_IMAGES = 24; @NonNull private final LruCache<String, String> pageImagesCache = new LruCache<>(MAX_CACHE_SIZE_IMAGES); private final DisambigResult[] items; private final WikiSite wiki = WikipediaApp.getInstance().getWikiSite(); DisambigListAdapter(@NonNull Context context, @NonNull DisambigResult[] items) { super(context, 0, items); this.items = items; requestPageImages(); fetchDescriptions(); } private void requestPageImages() { List<PageTitle> titleList = new ArrayList<>(); for (DisambigResult r : items) { if (pageImagesCache.get(r.getTitle().getPrefixedText()) == null) { // not in our cache yet titleList.add(r.getTitle()); } } if (titleList.isEmpty()) { return; } new PageImagesClient().request(wiki, titleList, new PageImagesClient.Callback() { @Override public void success(@NonNull Call<MwQueryResponse<MwQueryResponse.Pages>> call, @NonNull Map<PageTitle, PageImage> results) { for (Map.Entry<PageTitle, PageImage> entry : results.entrySet()) { if (entry.getValue() == null || entry.getValue().getImageName() == null) { continue; } pageImagesCache.put(entry.getKey().getPrefixedText(), entry.getValue().getImageName()); } notifyDataSetInvalidated(); } @Override public void failure(@NonNull Call<MwQueryResponse<MwQueryResponse.Pages>> call, @NonNull Throwable caught) { // Don't actually do anything. // Thumbnails are expendable } }); } /** * Start getting Wikidata descriptions (directly from the current Wikipedia wiki). */ private void fetchDescriptions() { final List<PageTitle> titleList = new ArrayList<>(); for (DisambigResult r : items) { titleList.add(r.getTitle()); } if (titleList.isEmpty()) { return; } new GetDescriptionsClient().request(wiki, titleList, new GetDescriptionsClient.Callback() { @Override public void success(@NonNull Call<MwQueryResponse<MwQueryResponse.Pages>> call, @NonNull List<MwQueryPage> results) { for (MwQueryPage page : results) { PageTitle pageTitle = new PageTitle(null, page.title(), wiki); for (PageTitle title : titleList) { if (title.getPrefixedText().equals(pageTitle.getPrefixedText()) || title.getDisplayText().equals(pageTitle.getDisplayText())) { title.setDescription(page.description()); break; } } } notifyDataSetChanged(); } @Override public void failure(@NonNull Call<MwQueryResponse<MwQueryResponse.Pages>> call, @NonNull Throwable caught) { // descriptions are expendable } }); } class ViewHolder { private SimpleDraweeView icon; private TextView title; private TextView description; } @Override @NonNull public View getView(int position, View convertView, @NonNull ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.item_page_list_entry, parent, false); holder = new ViewHolder(); holder.icon = (SimpleDraweeView) convertView.findViewById(R.id.page_list_item_image); holder.title = (TextView) convertView.findViewById(R.id.page_list_item_title); holder.description = (GoneIfEmptyTextView) convertView.findViewById(R.id.page_list_item_description); convertView.setTag(holder); } else { // view already defined, retrieve view holder holder = (ViewHolder) convertView.getTag(); } final DisambigResult item = items[position]; holder.title.setText(item.getTitle().getDisplayText()); holder.description.setText(StringUtils.capitalize(item.getTitle().getDescription())); ViewUtil.loadImageUrlInto(holder.icon, pageImagesCache.get(item.getTitle().getPrefixedText())); return convertView; } }