package com.bt.download.android.gui.transfers;
import com.bt.download.android.core.ConfigurationManager;
import com.bt.download.android.core.Constants;
import com.bt.download.android.gui.Librarian;
import com.bt.download.android.gui.NetworkManager;
import com.bt.download.android.gui.services.Engine;
import com.frostwire.bittorrent.BTDownload;
import com.frostwire.bittorrent.BTDownloadListener;
import com.frostwire.logging.Logger;
import com.frostwire.transfers.TransferItem;
import com.frostwire.util.DirectoryUtils;
import java.io.File;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* @author gubatron
* @author aldenml
*/
public final class UIBittorrentDownload implements BittorrentDownload {
private static final Logger LOG = Logger.getLogger(UIBittorrentDownload.class);
private final TransferManager manager;
private final BTDownload dl;
private String displayName;
private long size;
private List<TransferItem> items;
public UIBittorrentDownload(TransferManager manager, BTDownload dl) {
this.manager = manager;
this.dl = dl;
this.dl.setListener(new StatusListener());
this.displayName = dl.getDisplayName();
this.size = calculateSize(dl);
this.items = calculateItems(dl);
if (!dl.wasPaused()) {
dl.resume();
}
}
public BTDownload getDl() {
return dl;
}
@Override
public String getHash() {
return dl.getInfoHash();
}
@Override
public String getPeers() {
int connectedPeers = dl.getConnectedPeers();
int peers = dl.getTotalPeers();
String tmp = connectedPeers > peers ? "%1" : "%1 " + "/" + " %2";
tmp = tmp.replaceAll("%1", String.valueOf(connectedPeers));
tmp = tmp.replaceAll("%2", String.valueOf(peers));
return tmp;
}
@Override
public String getSeeds() {
int connectedSeeds = dl.getConnectedSeeds();
int seeds = dl.getTotalSeeds();
String tmp = connectedSeeds > seeds ? "%1" : "%1 " + "/" + " %2";
tmp = tmp.replaceAll("%1", String.valueOf(connectedSeeds));
String param2 = "?";
if (seeds != -1) {
param2 = String.valueOf(seeds);
}
tmp = tmp.replaceAll("%2", param2);
return tmp;
}
@Override
public boolean isResumable() {
return dl.isPaused();
}
@Override
public boolean isPausable() {
return !dl.isPaused();
}
@Override
public boolean isSeeding() {
return dl.isSeeding();
}
@Override
public void enqueue() {
}
@Override
public void pause() {
dl.pause();
}
@Override
public void resume() {
dl.resume();
}
@Override
public File getSavePath() {
return dl.getSavePath();
}
@Override
public boolean isDownloading() {
return dl.isDownloading();
}
@Override
public void cancel(boolean deleteData) {
manager.remove(this);
dl.remove(deleteData);
}
@Override
public String getDisplayName() {
return displayName;
}
@Override
public String getStatus() {
return dl.getState().toString();
}
@Override
public int getProgress() {
return dl.getProgress();
}
@Override
public long getSize() {
return size;
}
@Override
public Date getDateCreated() {
return dl.getCreated();
}
@Override
public long getBytesReceived() {
return dl.getBytesReceived();
}
@Override
public long getBytesSent() {
return dl.getBytesSent();
}
@Override
public long getDownloadSpeed() {
return dl.getDownloadSpeed();
}
@Override
public long getUploadSpeed() {
return dl.getUploadSpeed();
}
@Override
public long getETA() {
return dl.getETA();
}
@Override
public boolean isComplete() {
return dl.isComplete();
}
@Override
public List<TransferItem> getItems() {
return items;
}
@Override
public void cancel() {
cancel(false);
}
@Override
public String getDetailsUrl() {
return null;
}
private class StatusListener implements BTDownloadListener {
@Override
public void update(BTDownload dl) {
displayName = dl.getDisplayName();
size = calculateSize(dl);
items = calculateItems(dl);
}
@Override
public void finished(BTDownload dl) {
pauseSeedingIfNecessary(dl);
TransferManager.instance().incrementDownloadsToReview();
File saveLocation = getSavePath().getAbsoluteFile();
Engine.instance().notifyDownloadFinished(getDisplayName(), saveLocation);
Librarian.instance().scan(saveLocation);
}
private void pauseSeedingIfNecessary(BTDownload dl) {
boolean seedFinishedTorrents = ConfigurationManager.instance().getBoolean(Constants.PREF_KEY_TORRENT_SEED_FINISHED_TORRENTS);
boolean seedFinishedTorrentsOnWifiOnly = ConfigurationManager.instance().getBoolean(Constants.PREF_KEY_TORRENT_SEED_FINISHED_TORRENTS_WIFI_ONLY);
boolean isDataWIFIUp = NetworkManager.instance().isDataWIFIUp();
if (!seedFinishedTorrents || (!isDataWIFIUp && seedFinishedTorrentsOnWifiOnly)) {
dl.pause();
}
}
@Override
public void removed(BTDownload dl, Set<File> incompleteFiles) {
finalCleanup(incompleteFiles);
}
}
private void finalCleanup(Set<File> incompleteFiles) {
for (File f : incompleteFiles) {
try {
if (f.exists() && !f.delete()) {
LOG.info("Can't delete file: " + f);
}
} catch (Throwable e) {
LOG.info("Can't delete file: " + f);
}
}
DirectoryUtils.deleteEmptyDirectoryRecursive(dl.getSavePath());
}
private long calculateSize(BTDownload dl) {
long size = dl.getSize();
boolean partial = dl.isPartial();
if (partial) {
List<com.frostwire.transfers.TransferItem> items = dl.getItems();
long totalSize = 0;
for (com.frostwire.transfers.TransferItem item : items) {
if (!item.isSkipped()) {
totalSize += item.getSize();
}
}
if (totalSize > 0) {
size = totalSize;
}
}
return size;
}
private List<TransferItem> calculateItems(BTDownload dl) {
List<TransferItem> l = new LinkedList<TransferItem>();
for (TransferItem item : dl.getItems()) {
if (!item.isSkipped()) {
l.add(item);
}
}
return l;
}
}