com.bt.download.android.gui.adapters.TransferListAdapter.java Source code

Java tutorial

Introduction

Here is the source code for com.bt.download.android.gui.adapters.TransferListAdapter.java

Source

/*
 * Created by Angel Leon (@gubatron), Alden Torres (aldenml)
 * Copyright (c) 2011-2014, 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 java.io.File;
import java.lang.ref.WeakReference;
import java.util.*;

import com.frostwire.transfers.TransferItem;
import com.frostwire.transfers.TransferState;
import org.apache.commons.io.FilenameUtils;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.bt.download.android.R;
import com.bt.download.android.core.ConfigurationManager;
import com.bt.download.android.core.Constants;
import com.bt.download.android.core.MediaType;
import com.bt.download.android.gui.NetworkManager;
import com.bt.download.android.gui.adapters.menu.BrowsePeerMenuAction;
import com.bt.download.android.gui.adapters.menu.CancelMenuAction;
import com.bt.download.android.gui.adapters.menu.OpenMenuAction;
import com.bt.download.android.gui.adapters.menu.PauseDownloadMenuAction;
import com.bt.download.android.gui.adapters.menu.ResumeDownloadMenuAction;
import com.bt.download.android.gui.transfers.BittorrentDownload;
import com.bt.download.android.gui.transfers.DownloadTransfer;
import com.bt.download.android.gui.transfers.HttpDownload;
import com.bt.download.android.gui.transfers.PeerHttpDownload;
import com.bt.download.android.gui.transfers.PeerHttpUpload;
import com.bt.download.android.gui.transfers.SoundcloudDownload;
import com.bt.download.android.gui.transfers.TorrentFetcherDownload;
import com.bt.download.android.gui.transfers.Transfer;
import com.bt.download.android.gui.transfers.YouTubeDownload;
import com.bt.download.android.gui.util.UIUtils;
import com.bt.download.android.gui.views.MenuAction;
import com.bt.download.android.gui.views.MenuAdapter;
import com.bt.download.android.gui.views.MenuBuilder;
import com.frostwire.uxstats.UXAction;
import com.frostwire.uxstats.UXStats;

/**
 * 
 * @author gubatron
 * @author aldenml
 * 
 */
public class TransferListAdapter extends BaseExpandableListAdapter {

    private static final String TAG = "FW.TransferListAdapter";

    private final WeakReference<Context> context;

    private final OnClickListener viewOnClickListener;
    private final ViewOnLongClickListener viewOnLongClickListener;
    private final OpenOnClickListener playOnClickListener;

    /** Keep track of all dialogs ever opened so we dismiss when we leave to avoid memleaks */
    private final List<Dialog> dialogs;

    private List<Transfer> list;

    private final Map<String, String> TRANSFER_STATE_STRING_MAP = new Hashtable<String, String>();

    public TransferListAdapter(Context context, List<Transfer> list) {
        this.context = new WeakReference<Context>(context);

        this.viewOnClickListener = new ViewOnClickListener();
        this.viewOnLongClickListener = new ViewOnLongClickListener();
        this.playOnClickListener = new OpenOnClickListener();

        this.dialogs = new ArrayList<Dialog>();

        this.list = list.equals(Collections.emptyList()) ? new ArrayList<Transfer>() : list;

        initTransferStateStringMap();
    }

    private void initTransferStateStringMap() {
        Context c = context.get();
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.QUEUED_FOR_CHECKING),
                c.getString(R.string.queued_for_checking));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.CHECKING),
                c.getString(R.string.checking_ellipsis));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.DOWNLOADING_METADATA),
                c.getString(R.string.downloading_metadata));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.DOWNLOADING_TORRENT),
                c.getString(R.string.torrent_fetcher_download_status_downloading_torrent));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.DOWNLOADING),
                c.getString(R.string.azureus_manager_item_downloading));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.FINISHED),
                c.getString(R.string.azureus_peer_manager_status_finished));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.SEEDING),
                c.getString(R.string.azureus_manager_item_seeding));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.ALLOCATING),
                c.getString(R.string.azureus_manager_item_allocating));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.PAUSED),
                c.getString(R.string.azureus_manager_item_paused));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.ERROR),
                c.getString(R.string.azureus_manager_item_error));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.ERROR_MOVING_INCOMPLETE),
                c.getString(R.string.error_moving_incomplete));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.ERROR_HASH_MD5),
                c.getString(R.string.error_wrong_md5_hash));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.ERROR_SIGNATURE),
                c.getString(R.string.error_wrong_signature));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.ERROR_NOT_ENOUGH_PEERS),
                c.getString(R.string.error_not_enough_peers));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.STOPPED),
                c.getString(R.string.azureus_manager_item_stopped));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.PAUSING), c.getString(R.string.pausing));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.CANCELING), c.getString(R.string.canceling));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.CANCELED),
                c.getString(R.string.torrent_fetcher_download_status_canceled));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.WAITING), c.getString(R.string.waiting));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.COMPLETE),
                c.getString(R.string.peer_http_download_status_complete));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.UPLOADING),
                c.getString(R.string.peer_http_upload_status_uploading));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.UNCOMPRESSING),
                c.getString(R.string.http_download_status_uncompressing));
        TRANSFER_STATE_STRING_MAP.put(String.valueOf(TransferState.DEMUXING),
                c.getString(R.string.transfer_status_demuxing));
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return list.get(groupPosition).getItems().get(childPosition);
    }

    public TransferItem getChildItem(int groupPosition, int childPosition) {
        return list.get(groupPosition).getItems().get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
            ViewGroup parent) {

        TransferItem item = getChildItem(groupPosition, childPosition);

        if (convertView == null) {
            convertView = View.inflate(context.get(), R.layout.view_transfer_item_list_item, null);

            convertView.setOnClickListener(viewOnClickListener);
            convertView.setOnLongClickListener(viewOnLongClickListener);
        }

        try {

            initTouchFeedback(convertView, item);

            populateChildView(convertView, item);

        } catch (Throwable e) {
            Log.e(TAG, "Fatal error getting view: " + e.getMessage());
        }

        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        int size = list.get(groupPosition).getItems().size();
        return size <= 1 ? 0 : size;
    }

    @Override
    public Object getGroup(int groupPosition) {
        return list.get(groupPosition);
    }

    public Transfer getGroupItem(int groupPosition) {
        return list.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return list.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        Transfer item = getGroupItem(groupPosition);

        if (convertView == null || convertView instanceof TextView) {
            // convertView could be a dummy view due to an issue with the slide menu layout request order
            try {
                convertView = View.inflate(context.get(), R.layout.view_transfer_list_item, null);
            } catch (Throwable e) {
                // creating a dummy view to avoid a force close due to a NPE
                // next time the "if" will try to recover the actual layout
                convertView = new TextView(context.get());
                ((TextView) convertView).setText("Rendering error");
            }
        }

        try {
            boolean clickable = item.getItems().size() == 0;
            convertView.setOnClickListener(clickable ? viewOnClickListener : null);
            convertView.setOnLongClickListener(clickable ? viewOnLongClickListener : null);

            convertView.setClickable(clickable);
            convertView.setLongClickable(clickable);

            setupGroupIndicator(convertView, isExpanded, item);

            convertView.setTag(item);
            populateGroupView(convertView, item);
        } catch (Throwable e) {
            Log.e(TAG, "Fatal error getting the group view: " + e.getMessage(), e);
        }

        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }

    public void updateList(List<Transfer> g) {
        list = g;
        notifyDataSetChanged();
    }

    public void dismissDialogs() {
        for (Dialog dialog : dialogs) {
            try {
                dialog.dismiss();
            } catch (Throwable e) {
                Log.w(TAG, "Error dismissing dialog", e);
            }
        }
    }

    @SuppressWarnings("unchecked")
    protected static <TView extends View> TView findView(View view, int id) {
        return (TView) view.findViewById(id);
    }

    protected void populateGroupView(View view, Transfer transfer) {
        if (transfer instanceof BittorrentDownload) {
            populateBittorrentDownload(view, (BittorrentDownload) transfer);
        } else if (transfer instanceof PeerHttpDownload) {
            populatePeerDownload(view, (PeerHttpDownload) transfer);
        } else if (transfer instanceof PeerHttpUpload) {
            populatePeerUpload(view, (PeerHttpUpload) transfer);
        } else if (transfer instanceof HttpDownload) {
            populateHttpDownload(view, (HttpDownload) transfer);
        } else if (transfer instanceof YouTubeDownload) {
            populateYouTubeDownload(view, (YouTubeDownload) transfer);
        } else if (transfer instanceof SoundcloudDownload) {
            populateSoundcloudDownload(view, (SoundcloudDownload) transfer);
        }
    }

    protected void populateChildView(View view, TransferItem item) {
        populateBittorrentDownloadItem(view, item);
    }

    protected MenuAdapter getMenuAdapter(View view) {
        Object tag = view.getTag();
        String title = "";
        List<MenuAction> items = new ArrayList<MenuAction>();

        if (tag instanceof BittorrentDownload) {
            BittorrentDownload download = (BittorrentDownload) tag;
            title = download.getDisplayName();

            //If it's a torrent download with a single file, we should be able to open it.
            if (download.isComplete()) {
                TransferItem transferItem = download.getItems().get(0);
                String path = transferItem.getFile().getAbsolutePath();
                String mimeType = UIUtils.getMimeType(path);
                items.add(new OpenMenuAction(context.get(), path, mimeType));
            }

            if (!download.isComplete() || ConfigurationManager.instance()
                    .getBoolean(Constants.PREF_KEY_TORRENT_SEED_FINISHED_TORRENTS)) {
                if (download.isPausable()) {
                    items.add(new PauseDownloadMenuAction(context.get(), download));
                } else if (download.isResumable()) {
                    boolean wifiIsUp = NetworkManager.instance().isDataWIFIUp();
                    boolean bittorrentOnMobileData = ConfigurationManager.instance()
                            .getBoolean(Constants.PREF_KEY_NETWORK_USE_MOBILE_DATA);

                    if (wifiIsUp || (!wifiIsUp && bittorrentOnMobileData)) {
                        if (!download.isComplete()) {
                            items.add(new ResumeDownloadMenuAction(context.get(), download,
                                    R.string.resume_torrent_menu_action));
                        } else {
                            //let's see if we can seed...
                            boolean seedTorrents = ConfigurationManager.instance()
                                    .getBoolean(Constants.PREF_KEY_TORRENT_SEED_FINISHED_TORRENTS);
                            boolean seedTorrentsOnWifiOnly = ConfigurationManager.instance()
                                    .getBoolean(Constants.PREF_KEY_TORRENT_SEED_FINISHED_TORRENTS_WIFI_ONLY);
                            if ((seedTorrents && !seedTorrentsOnWifiOnly)
                                    || (seedTorrents && seedTorrentsOnWifiOnly && wifiIsUp)) {
                                items.add(new ResumeDownloadMenuAction(context.get(), download, R.string.seed));
                            }
                        }
                    }
                }
            }

            items.add(new CancelMenuAction(context.get(), download, !download.isComplete()));
        } else if (tag instanceof DownloadTransfer) {
            DownloadTransfer download = (DownloadTransfer) tag;
            title = download.getDisplayName();

            boolean errored = download.getStatus() != null
                    && getStatusFromResId(download.getStatus()).contains("Error");

            boolean openMenu = false;
            openMenu |= !errored && download.isComplete()
                    && (tag instanceof HttpDownload || tag instanceof PeerHttpDownload
                            || tag instanceof YouTubeDownload || tag instanceof SoundcloudDownload);

            if (openMenu) {
                items.add(new OpenMenuAction(context.get(), download.getDisplayName(),
                        download.getSavePath().getAbsolutePath(), extractMime(download)));
            }

            if (download instanceof PeerHttpDownload) {
                PeerHttpDownload pdownload = (PeerHttpDownload) download;
                items.add(new BrowsePeerMenuAction(context.get(), pdownload.getPeer()));
            }

            items.add(new CancelMenuAction(context.get(), download, !openMenu));

        } else if (tag instanceof PeerHttpUpload) {
            PeerHttpUpload upload = (PeerHttpUpload) tag;
            title = upload.getDisplayName();

            items.add(new CancelMenuAction(context.get(), upload, false));
        }

        return items.size() > 0 ? new MenuAdapter(context.get(), title, items) : null;
    }

    protected String extractMime(DownloadTransfer download) {
        if (download instanceof PeerHttpDownload) {
            return ((PeerHttpDownload) download).getFD().mime;
        } else {
            return UIUtils.getMimeType(download.getSavePath().getAbsolutePath());
        }
    }

    protected Dialog trackDialog(Dialog dialog) {
        dialogs.add(dialog);
        return dialog;
    }

    private void setupGroupIndicator(View view, boolean expanded, Transfer item) {
        ImageView groupIndicator = findView(view, R.id.view_transfer_list_item_group_indicator);

        if (groupIndicator != null) {
            if (item.getItems().size() <= 1) {
                //show the file type for the only file there is
                String extension = null;
                String path = null;

                if (item instanceof BittorrentDownload) {
                    BittorrentDownload bItem = (BittorrentDownload) item;
                    if (bItem.getItems().size() > 0) {
                        TransferItem transferItem = bItem.getItems().get(0);
                        path = transferItem.getFile().getAbsolutePath();
                        extension = FilenameUtils.getExtension(path);
                    }
                } else if (item instanceof DownloadTransfer) {
                    DownloadTransfer transferItem = (DownloadTransfer) item;
                    if (transferItem.getSavePath() != null) {
                        path = transferItem.getSavePath().getAbsolutePath();
                        extension = FilenameUtils.getExtension(path);
                    }
                } else if (item instanceof PeerHttpUpload) {
                    PeerHttpUpload transferItem = (PeerHttpUpload) item;
                    path = transferItem.getFD().filePath;
                    extension = FilenameUtils.getExtension(path);
                }

                if (extension != null && extension.equals("apk")) {
                    try {
                        //Apk apk = new Apk(context,path);

                        //TODO: Get the APK Icon so we can show the APK icon on the transfer manager once
                        //it's finished downloading, or as it's uploading to another peer.
                        //apk.getDrawable(id);

                        //in the meantime, just hardcode it
                        groupIndicator.setImageResource(R.drawable.browse_peer_application_icon_selector_menu);
                    } catch (Throwable e) {
                        groupIndicator.setImageResource(R.drawable.browse_peer_application_icon_selector_menu);
                    }
                } else {
                    groupIndicator.setImageResource(getFileTypeIconId(extension));
                }
            } else {
                groupIndicator.setImageResource(
                        expanded ? R.drawable.transfer_menuitem_minus : R.drawable.transfer_menuitem_plus);
            }
        }
    }

    private void initTouchFeedback(View v, TransferItem item) {
        v.setOnClickListener(viewOnClickListener);
        v.setOnLongClickListener(viewOnLongClickListener);
        v.setTag(item);

        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            int count = vg.getChildCount();
            for (int i = 0; i < count; i++) {
                View child = vg.getChildAt(i);
                initTouchFeedback(child, item);
            }
        }
    }

    private void populateBittorrentDownload(View view, BittorrentDownload download) {
        TextView title = findView(view, R.id.view_transfer_list_item_title);
        ProgressBar progress = findView(view, R.id.view_transfer_list_item_progress);
        TextView status = findView(view, R.id.view_transfer_list_item_status);
        TextView speed = findView(view, R.id.view_transfer_list_item_speed);
        TextView size = findView(view, R.id.view_transfer_list_item_size);
        ImageView buttonAction = findView(view, R.id.view_transfer_list_item_button_action);

        TextView seeds = findView(view, R.id.view_transfer_list_item_seeds);
        TextView peers = findView(view, R.id.view_transfer_list_item_peers);

        seeds.setText(context.get().getString(R.string.seeds_n, download.getSeeds()));
        peers.setText(context.get().getString(R.string.peers_n, download.getPeers()));

        title.setText(download.getDisplayName());
        progress.setProgress(download.getProgress());

        status.setText(TRANSFER_STATE_STRING_MAP.get(download.getStatus()));

        speed.setText(UIUtils.getBytesInHuman(download.getDownloadSpeed()) + "/s");
        size.setText(UIUtils.getBytesInHuman(download.getSize()));

        buttonAction.setTag(download);
        buttonAction.setOnClickListener(viewOnClickListener);
    }

    private void populatePeerDownload(View view, PeerHttpDownload download) {
        TextView title = findView(view, R.id.view_transfer_list_item_title);
        ProgressBar progress = findView(view, R.id.view_transfer_list_item_progress);
        TextView status = findView(view, R.id.view_transfer_list_item_status);
        TextView speed = findView(view, R.id.view_transfer_list_item_speed);
        TextView size = findView(view, R.id.view_transfer_list_item_size);
        TextView seeds = findView(view, R.id.view_transfer_list_item_seeds);
        TextView peers = findView(view, R.id.view_transfer_list_item_peers);
        ImageView buttonAction = findView(view, R.id.view_transfer_list_item_button_action);

        seeds.setText("");
        peers.setText("");
        title.setText(download.getDisplayName());
        progress.setProgress(download.getProgress());
        status.setText(getStatusFromResId(download.getStatus()));
        speed.setText(UIUtils.getBytesInHuman(download.getDownloadSpeed()) + "/s");
        size.setText(UIUtils.getBytesInHuman(download.getSize()));

        buttonAction.setTag(download);
        buttonAction.setOnClickListener(viewOnClickListener);
    }

    private void populatePeerUpload(View view, PeerHttpUpload upload) {
        TextView title = findView(view, R.id.view_transfer_list_item_title);
        ProgressBar progress = findView(view, R.id.view_transfer_list_item_progress);
        TextView status = findView(view, R.id.view_transfer_list_item_status);
        TextView speed = findView(view, R.id.view_transfer_list_item_speed);
        TextView size = findView(view, R.id.view_transfer_list_item_size);
        TextView seeds = findView(view, R.id.view_transfer_list_item_seeds);
        TextView peers = findView(view, R.id.view_transfer_list_item_peers);
        ImageView buttonAction = findView(view, R.id.view_transfer_list_item_button_action);

        seeds.setText("");
        peers.setText("");
        title.setText(upload.getDisplayName());
        progress.setProgress(upload.getProgress());
        status.setText(getStatusFromResId(upload.getStatus()));
        speed.setText(UIUtils.getBytesInHuman(upload.getUploadSpeed()) + "/s");
        size.setText(UIUtils.getBytesInHuman(upload.getSize()));

        buttonAction.setTag(upload);
        buttonAction.setOnClickListener(viewOnClickListener);
    }

    private void populateHttpDownload(View view, HttpDownload download) {
        TextView title = findView(view, R.id.view_transfer_list_item_title);
        ProgressBar progress = findView(view, R.id.view_transfer_list_item_progress);
        TextView status = findView(view, R.id.view_transfer_list_item_status);
        TextView speed = findView(view, R.id.view_transfer_list_item_speed);
        TextView size = findView(view, R.id.view_transfer_list_item_size);
        TextView seeds = findView(view, R.id.view_transfer_list_item_seeds);
        TextView peers = findView(view, R.id.view_transfer_list_item_peers);
        ImageView buttonAction = findView(view, R.id.view_transfer_list_item_button_action);

        seeds.setText("");
        peers.setText("");
        title.setText(download.getDisplayName());
        progress.setProgress(download.getProgress());
        status.setText(getStatusFromResId(download.getStatus()));
        speed.setText(UIUtils.getBytesInHuman(download.getDownloadSpeed()) + "/s");
        size.setText(UIUtils.getBytesInHuman(download.getSize()));

        buttonAction.setTag(download);
        buttonAction.setOnClickListener(viewOnClickListener);
    }

    private void populateBittorrentDownloadItem(View view, TransferItem item) {
        ImageView icon = findView(view, R.id.view_transfer_item_list_item_icon);
        TextView title = findView(view, R.id.view_transfer_item_list_item_title);
        ProgressBar progress = findView(view, R.id.view_transfer_item_list_item_progress);
        TextView size = findView(view, R.id.view_transfer_item_list_item_size);
        ImageButton buttonPlay = findView(view, R.id.view_transfer_item_list_item_button_play);

        icon.setImageResource(getFileTypeIconId(FilenameUtils.getExtension(item.getFile().getAbsolutePath())));
        title.setText(item.getDisplayName());
        progress.setProgress(item.getProgress());
        size.setText(UIUtils.getBytesInHuman(item.getSize()));

        buttonPlay.setTag(item);
        buttonPlay.setVisibility(item.isComplete() ? View.VISIBLE : View.GONE);
        buttonPlay.setOnClickListener(playOnClickListener);
    }

    private void populateYouTubeDownload(View view, YouTubeDownload download) {
        TextView title = findView(view, R.id.view_transfer_list_item_title);
        ProgressBar progress = findView(view, R.id.view_transfer_list_item_progress);
        TextView status = findView(view, R.id.view_transfer_list_item_status);
        TextView speed = findView(view, R.id.view_transfer_list_item_speed);
        TextView size = findView(view, R.id.view_transfer_list_item_size);
        TextView seeds = findView(view, R.id.view_transfer_list_item_seeds);
        TextView peers = findView(view, R.id.view_transfer_list_item_peers);
        ImageView buttonAction = findView(view, R.id.view_transfer_list_item_button_action);

        seeds.setText("");
        peers.setText("");
        title.setText(download.getDisplayName());
        progress.setProgress(download.getProgress());
        status.setText(getStatusFromResId(download.getStatus()));
        speed.setText(UIUtils.getBytesInHuman(download.getDownloadSpeed()) + "/s");
        size.setText(UIUtils.getBytesInHuman(download.getSize()));

        buttonAction.setTag(download);
        buttonAction.setOnClickListener(viewOnClickListener);
    }

    private void populateSoundcloudDownload(View view, SoundcloudDownload download) {
        TextView title = findView(view, R.id.view_transfer_list_item_title);
        ProgressBar progress = findView(view, R.id.view_transfer_list_item_progress);
        TextView status = findView(view, R.id.view_transfer_list_item_status);
        TextView speed = findView(view, R.id.view_transfer_list_item_speed);
        TextView size = findView(view, R.id.view_transfer_list_item_size);
        TextView seeds = findView(view, R.id.view_transfer_list_item_seeds);
        TextView peers = findView(view, R.id.view_transfer_list_item_peers);
        ImageView buttonAction = findView(view, R.id.view_transfer_list_item_button_action);

        seeds.setText("");
        peers.setText("");
        title.setText(download.getDisplayName());
        progress.setProgress(download.getProgress());
        status.setText(getStatusFromResId(download.getStatus()));
        speed.setText(UIUtils.getBytesInHuman(download.getDownloadSpeed()) + "/s");
        size.setText(UIUtils.getBytesInHuman(download.getSize()));

        buttonAction.setTag(download);
        buttonAction.setOnClickListener(viewOnClickListener);
    }

    private String getStatusFromResId(String str) {
        String s = "";
        try {
            s = context.get().getString(Integer.parseInt(str));
        } catch (Throwable e) {
            // ignore
        }
        return s;
    }

    private static int getFileTypeIconId(String ext) {
        MediaType mt = MediaType.getMediaTypeForExtension(ext);
        if (mt == null) {
            return R.drawable.question_mark;
        }
        if (mt.equals(MediaType.getApplicationsMediaType())) {
            return R.drawable.browse_peer_application_icon_selector_menu;
        } else if (mt.equals(MediaType.getAudioMediaType())) {
            return R.drawable.browse_peer_audio_icon_selector_menu;
        } else if (mt.equals(MediaType.getDocumentMediaType())) {
            return R.drawable.browse_peer_document_icon_selector_menu;
        } else if (mt.equals(MediaType.getImageMediaType())) {
            return R.drawable.browse_peer_picture_icon_selector_menu;
        } else if (mt.equals(MediaType.getVideoMediaType())) {
            return R.drawable.browse_peer_video_icon_selector_menu;
        } else if (mt.equals(MediaType.getTorrentMediaType())) {
            return R.drawable.browse_peer_torrent_icon_selector_menu;
        } else {
            return R.drawable.question_mark;
        }
    }

    private final class ViewOnClickListener implements OnClickListener {
        public void onClick(View v) {
            try {
                MenuAdapter adapter = getMenuAdapter(v);
                if (adapter != null) {
                    trackDialog(new MenuBuilder(adapter).show());
                    return;
                }
            } catch (Throwable e) {
                Log.e(TAG, "Failed to create the menu", e);
            }
        }
    }

    private final class ViewOnLongClickListener implements OnLongClickListener {
        public boolean onLongClick(View v) {
            try {
                MenuAdapter adapter = getMenuAdapter(v);
                if (adapter != null) {
                    trackDialog(new MenuBuilder(adapter).show());
                    return true;
                }
            } catch (Throwable e) {
                Log.e(TAG, "Failed to create the menu");
            }
            return false;
        }
    }

    private final class OpenOnClickListener implements OnClickListener {
        public void onClick(View v) {
            TransferItem item = (TransferItem) v.getTag();

            boolean canOpen = false;
            canOpen |= item.isComplete();

            if (canOpen) {
                File savePath = item.getFile();

                if (savePath != null) {
                    if (savePath.exists()) {
                        UIUtils.openFile(context.get(), savePath);
                    } else {
                        UIUtils.showShortMessage(context.get(), R.string.cant_open_file_does_not_exist,
                                savePath.getName());
                    }
                }
            }
        }
    }
}