From cd99cbb1597ce57fffa2af497af2e271ab0b2e8b Mon Sep 17 00:00:00 2001 From: Phillip Dykman Date: Wed, 27 Nov 2019 22:32:06 -0800 Subject: [PATCH 1/9] Add sequential download and first+last piece prioratization download modes, implemented for qbittorrent --- .../transdroid/core/gui/DetailsActivity.java | 26 ++++++++++++++++ .../transdroid/core/gui/DetailsFragment.java | 27 ++++++++++++++++ .../core/gui/TorrentTasksExecutor.java | 4 +++ .../transdroid/core/gui/TorrentsActivity.java | 26 ++++++++++++++++ .../java/org/transdroid/daemon/Daemon.java | 8 +++++ .../org/transdroid/daemon/DaemonMethod.java | 4 ++- .../Qbittorrent/QbittorrentAdapter.java | 31 +++++++++++++++---- .../java/org/transdroid/daemon/Torrent.java | 23 ++++++++++++++ .../ToggleFirstLastPieceDownloadTask.java | 31 +++++++++++++++++++ .../task/ToggleSequentialDownloadTask.java | 31 +++++++++++++++++++ app/src/main/res/menu/fragment_details.xml | 31 ++++++++++++++----- app/src/main/res/values/strings.xml | 4 +++ 12 files changed, 232 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/org/transdroid/daemon/task/ToggleFirstLastPieceDownloadTask.java create mode 100644 app/src/main/java/org/transdroid/daemon/task/ToggleSequentialDownloadTask.java diff --git a/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java b/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java index 8a0da758..205731a1 100644 --- a/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java +++ b/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java @@ -56,6 +56,8 @@ import org.transdroid.daemon.TorrentFile; import org.transdroid.daemon.task.DaemonTaskFailureResult; import org.transdroid.daemon.task.DaemonTaskResult; import org.transdroid.daemon.task.DaemonTaskSuccessResult; +import org.transdroid.daemon.task.ToggleSequentialDownloadTask; +import org.transdroid.daemon.task.ToggleFirstLastPieceDownloadTask; import org.transdroid.daemon.task.ForceRecheckTask; import org.transdroid.daemon.task.GetFileListTask; import org.transdroid.daemon.task.GetFileListTaskSuccessResult; @@ -278,6 +280,30 @@ public class DetailsActivity extends AppCompatActivity implements TorrentTasksEx } } + @Background + @Override + public void toggleSequentialDownload(Torrent torrent, boolean sequentialState) { + torrent.mimicSequentialDownload(sequentialState); + DaemonTaskResult result = ToggleSequentialDownloadTask.create(currentConnection, torrent).execute(log); + if (result instanceof DaemonTaskSuccessResult) { + onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.result_togglesequential)); + } else { + onCommunicationError((DaemonTaskFailureResult) result, false); + } + } + + @Background + @Override + public void toggleFirstLastPieceDownload(Torrent torrent, boolean firstLastPieceState) { + torrent.mimicFirstLastPieceDownload(firstLastPieceState); + DaemonTaskResult result = ToggleFirstLastPieceDownloadTask.create(currentConnection, torrent).execute(log); + if (result instanceof DaemonTaskSuccessResult) { + onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.action_toggle_firstlastpiece)); + } else { + onCommunicationError((DaemonTaskFailureResult) result, false); + } + } + @Background @Override public void forceRecheckTorrent(Torrent torrent) { diff --git a/app/src/main/java/org/transdroid/core/gui/DetailsFragment.java b/app/src/main/java/org/transdroid/core/gui/DetailsFragment.java index 79843c00..5648bee0 100644 --- a/app/src/main/java/org/transdroid/core/gui/DetailsFragment.java +++ b/app/src/main/java/org/transdroid/core/gui/DetailsFragment.java @@ -301,6 +301,12 @@ public class DetailsFragment extends Fragment implements OnTrackersUpdatedListen case R.id.action_stop: stopTorrent(); return true; + case R.id.action_toggle_sequential: + toggleSequentialDownload(menuItem); + return true; + case R.id.action_toggle_firstlastpiece: + toggleFirstLastPieceDownload(menuItem); + return true; case R.id.action_forcerecheck: setForceRecheck(); return true; @@ -359,6 +365,15 @@ public class DetailsFragment extends Fragment implements OnTrackersUpdatedListen detailsMenu.getMenu().findItem(R.id.action_setlabel).setVisible(setLabel); boolean forceRecheck = Daemon.supportsForceRecheck(torrent.getDaemon()); detailsMenu.getMenu().findItem(R.id.action_forcerecheck).setVisible(forceRecheck); + boolean sequentialdl = Daemon.supportsSequentialDownload(torrent.getDaemon()); + MenuItem seqMenuItem = detailsMenu.getMenu().findItem(R.id.action_toggle_sequential); + seqMenuItem.setVisible(sequentialdl); + seqMenuItem.setChecked(torrent.isSequentiallyDownloading()); + boolean firstlastpiecedl = Daemon.supportsFirstLastPiece(torrent.getDaemon()); + MenuItem flpMenuItem = detailsMenu.getMenu().findItem(R.id.action_toggle_firstlastpiece); + flpMenuItem.setVisible(firstlastpiecedl); + flpMenuItem.setChecked(torrent.isDownloadingFirstLastPieceFirst()); + detailsMenu.getMenu().findItem(R.id.action_download_mode).setVisible(firstlastpiecedl || sequentialdl); boolean setTrackers = Daemon.supportsSetTrackers(torrent.getDaemon()); detailsMenu.getMenu().findItem(R.id.action_updatetrackers).setVisible(setTrackers); boolean setLocation = Daemon.supportsSetDownloadLocation(torrent.getDaemon()); @@ -421,6 +436,18 @@ public class DetailsFragment extends Fragment implements OnTrackersUpdatedListen } } + @OptionsItem(R.id.action_toggle_sequential) + protected void toggleSequentialDownload(MenuItem menuItem) { + if (getTasksExecutor() != null) + getTasksExecutor().toggleSequentialDownload(torrent, !menuItem.isChecked()); + } + + @OptionsItem(R.id.action_toggle_firstlastpiece) + protected void toggleFirstLastPieceDownload(MenuItem menuItem) { + if (getTasksExecutor() != null) + getTasksExecutor().toggleFirstLastPieceDownload(torrent, !menuItem.isChecked()); + } + @OptionsItem(R.id.action_forcerecheck) protected void setForceRecheck() { if (getTasksExecutor() != null) diff --git a/app/src/main/java/org/transdroid/core/gui/TorrentTasksExecutor.java b/app/src/main/java/org/transdroid/core/gui/TorrentTasksExecutor.java index b9418bb9..cb405ce2 100644 --- a/app/src/main/java/org/transdroid/core/gui/TorrentTasksExecutor.java +++ b/app/src/main/java/org/transdroid/core/gui/TorrentTasksExecutor.java @@ -40,6 +40,10 @@ public interface TorrentTasksExecutor { void removeTorrent(Torrent torrent, boolean withData); + void toggleSequentialDownload(Torrent torrent, boolean sequentialState); + + void toggleFirstLastPieceDownload(Torrent torrent, boolean sequentialState); + void forceRecheckTorrent(Torrent torrent); void updateLabel(Torrent torrent, String newLabel); diff --git a/app/src/main/java/org/transdroid/core/gui/TorrentsActivity.java b/app/src/main/java/org/transdroid/core/gui/TorrentsActivity.java index 2956cf2b..a0d259e2 100644 --- a/app/src/main/java/org/transdroid/core/gui/TorrentsActivity.java +++ b/app/src/main/java/org/transdroid/core/gui/TorrentsActivity.java @@ -103,6 +103,8 @@ import org.transdroid.daemon.task.AddByUrlTask; import org.transdroid.daemon.task.DaemonTaskFailureResult; import org.transdroid.daemon.task.DaemonTaskResult; import org.transdroid.daemon.task.DaemonTaskSuccessResult; +import org.transdroid.daemon.task.ToggleSequentialDownloadTask; +import org.transdroid.daemon.task.ToggleFirstLastPieceDownloadTask; import org.transdroid.daemon.task.ForceRecheckTask; import org.transdroid.daemon.task.GetFileListTask; import org.transdroid.daemon.task.GetFileListTaskSuccessResult; @@ -1225,6 +1227,30 @@ public class TorrentsActivity extends AppCompatActivity implements TorrentTasksE } } + @Background + @Override + public void toggleSequentialDownload(Torrent torrent, boolean sequentialState) { + torrent.mimicSequentialDownload(sequentialState); + DaemonTaskResult result = ToggleSequentialDownloadTask.create(currentConnection, torrent).execute(log); + if (result instanceof DaemonTaskSuccessResult) { + onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.result_togglesequential)); + } else { + onCommunicationError((DaemonTaskFailureResult) result, false); + } + } + + @Background + @Override + public void toggleFirstLastPieceDownload(Torrent torrent, boolean firstLastPieceState) { + torrent.mimicFirstLastPieceDownload(firstLastPieceState); + DaemonTaskResult result = ToggleFirstLastPieceDownloadTask.create(currentConnection, torrent).execute(log); + if (result instanceof DaemonTaskSuccessResult) { + onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.action_toggle_firstlastpiece)); + } else { + onCommunicationError((DaemonTaskFailureResult) result, false); + } + } + @Background @Override public void forceRecheckTorrent(Torrent torrent) { diff --git a/app/src/main/java/org/transdroid/daemon/Daemon.java b/app/src/main/java/org/transdroid/daemon/Daemon.java index d4d88c5e..121f6674 100644 --- a/app/src/main/java/org/transdroid/daemon/Daemon.java +++ b/app/src/main/java/org/transdroid/daemon/Daemon.java @@ -412,6 +412,14 @@ public enum Daemon { || type == Transmission || type == Dummy || type == qBittorrent; } + public static boolean supportsSequentialDownload(Daemon type) { + return type == qBittorrent; + } + + public static boolean supportsFirstLastPiece(Daemon type) { + return type == qBittorrent; + } + public static boolean supportsExtraPassword(Daemon type) { return type == Deluge || type == Aria2; } diff --git a/app/src/main/java/org/transdroid/daemon/DaemonMethod.java b/app/src/main/java/org/transdroid/daemon/DaemonMethod.java index f9ec9b7b..e0e242ef 100644 --- a/app/src/main/java/org/transdroid/daemon/DaemonMethod.java +++ b/app/src/main/java/org/transdroid/daemon/DaemonMethod.java @@ -44,7 +44,9 @@ public enum DaemonMethod { SetTrackers (19), SetAlternativeMode (20), GetStats (21), - ForceRecheck (22); + ForceRecheck (22), + ToggleSequentialDownload(23), + ToggleFirstLastPieceDownload(24); private int code; private static final Map lookup = new HashMap<>(); diff --git a/app/src/main/java/org/transdroid/daemon/Qbittorrent/QbittorrentAdapter.java b/app/src/main/java/org/transdroid/daemon/Qbittorrent/QbittorrentAdapter.java index 0982053d..7f693b8f 100644 --- a/app/src/main/java/org/transdroid/daemon/Qbittorrent/QbittorrentAdapter.java +++ b/app/src/main/java/org/transdroid/daemon/Qbittorrent/QbittorrentAdapter.java @@ -286,11 +286,23 @@ public class QbittorrentAdapter implements IDaemonAdapter { } return new DaemonTaskSuccessResult(task); - case ForceRecheck: + case ForceRecheck: - // Force recheck a torrent - makeRequest(log, "/command/recheck", new BasicNameValuePair("hash", task.getTargetTorrent().getUniqueID())); - return new DaemonTaskSuccessResult(task); + // Force recheck a torrent + makeRequest(log, "/command/recheck", new BasicNameValuePair("hash", task.getTargetTorrent().getUniqueID())); + return new DaemonTaskSuccessResult(task); + + case ToggleSequentialDownload: + + // Toggle sequential download mode on a torrent + makeRequest(log, "/command/toggleSequentialDownload", new BasicNameValuePair("hashes", task.getTargetTorrent().getUniqueID())); + return new DaemonTaskSuccessResult(task); + + case ToggleFirstLastPieceDownload: + + // Set policy for downloading first and last piece first on a torrent + makeRequest(log, "/command/toggleFirstLastPiecePrio", new BasicNameValuePair("hashes", task.getTargetTorrent().getUniqueID())); + return new DaemonTaskSuccessResult(task); case SetLabel: @@ -492,6 +504,8 @@ public class QbittorrentAdapter implements IDaemonAdapter { long uploaded; int dlspeed; int upspeed; + boolean dlseq = false; + boolean dlflp = false; Date addedOn = null; Date completionOn = null; String label = null; @@ -507,6 +521,8 @@ public class QbittorrentAdapter implements IDaemonAdapter { ratio = tor.getDouble("ratio"); dlspeed = tor.getInt("dlspeed"); upspeed = tor.getInt("upspeed"); + dlseq = tor.getBoolean("seq_dl"); + dlflp = tor.getBoolean("f_l_piece_prio"); if (tor.has("uploaded")) { uploaded = tor.getLong("uploaded"); } else { @@ -535,7 +551,7 @@ public class QbittorrentAdapter implements IDaemonAdapter { eta = (long) (size - (size * progress)) / dlspeed; // Add the parsed torrent to the list // @formatter:off - torrents.add(new Torrent( + Torrent torrent = new Torrent( (long) i, tor.getString("hash"), tor.getString("name"), @@ -557,7 +573,10 @@ public class QbittorrentAdapter implements IDaemonAdapter { addedOn, completionOn, null, - settings.getType())); + settings.getType()); + torrent.mimicSequentialDownload(dlseq); + torrent.mimicFirstLastPieceDownload(dlflp); + torrents.add(torrent); // @formatter:on } diff --git a/app/src/main/java/org/transdroid/daemon/Torrent.java b/app/src/main/java/org/transdroid/daemon/Torrent.java index 446b9022..b7dd249e 100644 --- a/app/src/main/java/org/transdroid/daemon/Torrent.java +++ b/app/src/main/java/org/transdroid/daemon/Torrent.java @@ -49,6 +49,8 @@ public final class Torrent implements Parcelable, Comparable, Finishabl final private float partDone; final private float available; private String label; + private boolean sequentialDownload; + private boolean firstLastPieceDownload; final private Date dateAdded; final private Date dateDone; @@ -76,6 +78,8 @@ public final class Torrent implements Parcelable, Comparable, Finishabl this.partDone = in.readFloat(); this.available = in.readFloat(); this.label = in.readString(); + this.sequentialDownload = in.readByte() != 0; + this.firstLastPieceDownload = in.readByte() != 0; long lDateAdded = in.readLong(); this.dateAdded = (lDateAdded == -1) ? null : new Date(lDateAdded); @@ -109,6 +113,8 @@ public final class Torrent implements Parcelable, Comparable, Finishabl this.partDone = partDone; this.available = available; this.label = label; + this.sequentialDownload = false; + this.firstLastPieceDownload = false; this.dateAdded = dateAdded; if (realDateDone != null) { @@ -197,6 +203,13 @@ public final class Torrent implements Parcelable, Comparable, Finishabl return label; } + public boolean isSequentiallyDownloading() { + return sequentialDownload; + } + public boolean isDownloadingFirstLastPieceFirst() { + return firstLastPieceDownload; + } + public Date getDateAdded() { return dateAdded; } @@ -342,6 +355,14 @@ public final class Torrent implements Parcelable, Comparable, Finishabl label = newLabel; } + public void mimicSequentialDownload(boolean sequentialDownload) { + this.sequentialDownload = sequentialDownload; + } + + public void mimicFirstLastPieceDownload(boolean firstLastPieceDownload) { + this.firstLastPieceDownload = firstLastPieceDownload; + } + public void mimicCheckingStatus() { statusCode = TorrentStatus.Checking; } @@ -399,6 +420,8 @@ public final class Torrent implements Parcelable, Comparable, Finishabl dest.writeFloat(partDone); dest.writeFloat(available); dest.writeString(label); + dest.writeByte((byte) (sequentialDownload ? 1 : 0)); + dest.writeByte((byte) (firstLastPieceDownload ? 1 : 0)); dest.writeLong((dateAdded == null) ? -1 : dateAdded.getTime()); dest.writeLong((dateDone == null) ? -1 : dateDone.getTime()); diff --git a/app/src/main/java/org/transdroid/daemon/task/ToggleFirstLastPieceDownloadTask.java b/app/src/main/java/org/transdroid/daemon/task/ToggleFirstLastPieceDownloadTask.java new file mode 100644 index 00000000..3030c325 --- /dev/null +++ b/app/src/main/java/org/transdroid/daemon/task/ToggleFirstLastPieceDownloadTask.java @@ -0,0 +1,31 @@ +/* + * This file is part of Transdroid + * + * Transdroid 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. + * + * Transdroid 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 Transdroid. If not, see . + * + */ + package org.transdroid.daemon.task; + +import org.transdroid.daemon.DaemonMethod; +import org.transdroid.daemon.IDaemonAdapter; +import org.transdroid.daemon.Torrent; + +public class ToggleFirstLastPieceDownloadTask extends DaemonTask { + protected ToggleFirstLastPieceDownloadTask(IDaemonAdapter adapter, Torrent targetTorrent) { + super(adapter, DaemonMethod.ToggleFirstLastPieceDownload, targetTorrent, null); + } + public static ToggleFirstLastPieceDownloadTask create(IDaemonAdapter adapter, Torrent targetTorrent) { + return new ToggleFirstLastPieceDownloadTask(adapter, targetTorrent); + } +} diff --git a/app/src/main/java/org/transdroid/daemon/task/ToggleSequentialDownloadTask.java b/app/src/main/java/org/transdroid/daemon/task/ToggleSequentialDownloadTask.java new file mode 100644 index 00000000..74575e14 --- /dev/null +++ b/app/src/main/java/org/transdroid/daemon/task/ToggleSequentialDownloadTask.java @@ -0,0 +1,31 @@ +/* + * This file is part of Transdroid + * + * Transdroid 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. + * + * Transdroid 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 Transdroid. If not, see . + * + */ + package org.transdroid.daemon.task; + +import org.transdroid.daemon.DaemonMethod; +import org.transdroid.daemon.IDaemonAdapter; +import org.transdroid.daemon.Torrent; + +public class ToggleSequentialDownloadTask extends DaemonTask { + protected ToggleSequentialDownloadTask(IDaemonAdapter adapter, Torrent targetTorrent) { + super(adapter, DaemonMethod.ToggleSequentialDownload, targetTorrent, null); + } + public static ToggleSequentialDownloadTask create(IDaemonAdapter adapter, Torrent targetTorrent) { + return new ToggleSequentialDownloadTask(adapter, targetTorrent); + } +} diff --git a/app/src/main/res/menu/fragment_details.xml b/app/src/main/res/menu/fragment_details.xml index 93a73257..7abfd206 100644 --- a/app/src/main/res/menu/fragment_details.xml +++ b/app/src/main/res/menu/fragment_details.xml @@ -47,19 +47,36 @@ + + + + + + @@ -74,25 +91,25 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7eb5dc56..c96932b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,6 +56,9 @@ Remove torrent Remove and delete data Set label + Set download mode + Download sequentially + Download first and last pieces first Update trackers Change storage location Force data recheck @@ -175,6 +178,7 @@ Trackers updated Label set to \'%1$s\' Label removed + Toggled sequential download mode Checking %1$s data Torrent moved to \'%1$s\' File priorities updated From 99c419950e3984bc3680351a3c7e86321b986ecb Mon Sep 17 00:00:00 2001 From: Phillip Dykman Date: Wed, 27 Nov 2019 22:35:55 -0800 Subject: [PATCH 2/9] Only show download mode options for active torrents --- app/src/main/java/org/transdroid/core/gui/DetailsFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/transdroid/core/gui/DetailsFragment.java b/app/src/main/java/org/transdroid/core/gui/DetailsFragment.java index 5648bee0..08dad7eb 100644 --- a/app/src/main/java/org/transdroid/core/gui/DetailsFragment.java +++ b/app/src/main/java/org/transdroid/core/gui/DetailsFragment.java @@ -373,7 +373,7 @@ public class DetailsFragment extends Fragment implements OnTrackersUpdatedListen MenuItem flpMenuItem = detailsMenu.getMenu().findItem(R.id.action_toggle_firstlastpiece); flpMenuItem.setVisible(firstlastpiecedl); flpMenuItem.setChecked(torrent.isDownloadingFirstLastPieceFirst()); - detailsMenu.getMenu().findItem(R.id.action_download_mode).setVisible(firstlastpiecedl || sequentialdl); + detailsMenu.getMenu().findItem(R.id.action_download_mode).setVisible(!torrent.isFinished() && (firstlastpiecedl || sequentialdl)); boolean setTrackers = Daemon.supportsSetTrackers(torrent.getDaemon()); detailsMenu.getMenu().findItem(R.id.action_updatetrackers).setVisible(setTrackers); boolean setLocation = Daemon.supportsSetDownloadLocation(torrent.getDaemon()); From 80e388a5600b8b69d70249f434b41e6d967ec855 Mon Sep 17 00:00:00 2001 From: Phillip Dykman Date: Wed, 27 Nov 2019 22:51:06 -0800 Subject: [PATCH 3/9] Make the successfull task snackbar duration a bit shorter (about 2s shorter). Helpful for two consecutive setting inputs, as you dont have to wait. --- app/src/main/java/org/transdroid/core/gui/DetailsActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java b/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java index 205731a1..59b48fc8 100644 --- a/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java +++ b/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java @@ -356,7 +356,7 @@ public class DetailsActivity extends AppCompatActivity implements TorrentTasksEx // Refresh the screen as well refreshTorrent(); refreshTorrentDetails(torrent); - SnackbarManager.show(Snackbar.with(this).text(successMessage)); + SnackbarManager.show(Snackbar.with(this).text(successMessage).duration(Snackbar.SnackbarDuration.LENGTH_SHORT)); } @UiThread From 1fbb3dcea9efe3dd749e1ac092b7f6a926c7a466 Mon Sep 17 00:00:00 2001 From: Phillip Dykman Date: Wed, 27 Nov 2019 22:56:37 -0800 Subject: [PATCH 4/9] Adjust strings --- .../main/java/org/transdroid/core/gui/DetailsActivity.java | 2 +- app/src/main/res/values/strings.xml | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java b/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java index 59b48fc8..448a9c25 100644 --- a/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java +++ b/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java @@ -298,7 +298,7 @@ public class DetailsActivity extends AppCompatActivity implements TorrentTasksEx torrent.mimicFirstLastPieceDownload(firstLastPieceState); DaemonTaskResult result = ToggleFirstLastPieceDownloadTask.create(currentConnection, torrent).execute(log); if (result instanceof DaemonTaskSuccessResult) { - onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.action_toggle_firstlastpiece)); + onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.result_togglefirstlastpiece)); } else { onCommunicationError((DaemonTaskFailureResult) result, false); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c96932b3..e11907ce 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,9 +56,9 @@ Remove torrent Remove and delete data Set label - Set download mode + Download mode Download sequentially - Download first and last pieces first + Prioritize first and last piece Update trackers Change storage location Force data recheck @@ -179,6 +179,7 @@ Label set to \'%1$s\' Label removed Toggled sequential download mode + Toggled first and last piece priority Checking %1$s data Torrent moved to \'%1$s\' File priorities updated From 38943bf7f07f696af266c6e55c6ec885037d848b Mon Sep 17 00:00:00 2001 From: Phillip Dykman Date: Thu, 28 Nov 2019 20:37:19 -0800 Subject: [PATCH 5/9] Russian localization --- app/src/main/res/values-ru/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fa16ea36..5840d258 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -54,6 +54,9 @@ Удалить торрент-файл Удалить вместе с данными Установить метку + Режим скачивания + Скачать последовательно + Скачать начало и конец первыми Обновить трекеры Изменить место расположения Пересчитать хэш @@ -167,6 +170,8 @@ Трекеры обновлены Метка установлена ​​в \'%1$s\' Метка удалена + Изменено последовательное скачивание торрента + Изменен приоритет скачивания начала и конца торрента Проверка данных %1$s Торрент перемещен в \'%1$s\' Приоритеты файлов обновлены From f9de3b095ced49ad5ae483ec42c19c40a8320ce0 Mon Sep 17 00:00:00 2001 From: Phillip Dykman Date: Thu, 28 Nov 2019 20:53:54 -0800 Subject: [PATCH 6/9] Make result strings be result dynamic --- .../java/org/transdroid/core/gui/DetailsActivity.java | 10 ++++++++-- app/src/main/res/values-ru/strings.xml | 6 ++++++ app/src/main/res/values/strings.xml | 8 ++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java b/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java index 448a9c25..c67d1f13 100644 --- a/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java +++ b/app/src/main/java/org/transdroid/core/gui/DetailsActivity.java @@ -284,9 +284,12 @@ public class DetailsActivity extends AppCompatActivity implements TorrentTasksEx @Override public void toggleSequentialDownload(Torrent torrent, boolean sequentialState) { torrent.mimicSequentialDownload(sequentialState); + String onState = getString(R.string.result_togglesequential_onstate); + String offState = getString(R.string.result_togglesequential_offstate); + String stateString = sequentialState ? onState : offState; DaemonTaskResult result = ToggleSequentialDownloadTask.create(currentConnection, torrent).execute(log); if (result instanceof DaemonTaskSuccessResult) { - onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.result_togglesequential)); + onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.result_togglesequential, torrent.getName(), stateString)); } else { onCommunicationError((DaemonTaskFailureResult) result, false); } @@ -296,9 +299,12 @@ public class DetailsActivity extends AppCompatActivity implements TorrentTasksEx @Override public void toggleFirstLastPieceDownload(Torrent torrent, boolean firstLastPieceState) { torrent.mimicFirstLastPieceDownload(firstLastPieceState); + String onState = getString(R.string.result_togglefirstlastpiece_onstate); + String offState = getString(R.string.result_togglefirstlastpiece_offstate); + String stateString = firstLastPieceState ? onState : offState; DaemonTaskResult result = ToggleFirstLastPieceDownloadTask.create(currentConnection, torrent).execute(log); if (result instanceof DaemonTaskSuccessResult) { - onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.result_togglefirstlastpiece)); + onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.result_togglefirstlastpiece, torrent.getName(), stateString)); } else { onCommunicationError((DaemonTaskFailureResult) result, false); } diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5840d258..cb9edf92 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -170,6 +170,12 @@ Трекеры обновлены Метка установлена ​​в \'%1$s\' Метка удалена + %1$s скачивается %2$s + последовательно + обычным образом + %1$s имеет %2$s + приоритет первого и последнего куска + обычый приоритет кусков Изменено последовательное скачивание торрента Изменен приоритет скачивания начала и конца торрента Проверка данных %1$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e11907ce..949b2e56 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -178,8 +178,12 @@ Trackers updated Label set to \'%1$s\' Label removed - Toggled sequential download mode - Toggled first and last piece priority + %1$s is downloading %2$s + normally + sequentially + %1$s has %2$s + first and last piece priority + normal piece priority Checking %1$s data Torrent moved to \'%1$s\' File priorities updated From dd6b427777733b7a829afba2dbab9d285a34b0fb Mon Sep 17 00:00:00 2001 From: Phillip Dykman Date: Fri, 29 Nov 2019 18:46:49 -0800 Subject: [PATCH 7/9] Fix minor typo --- .../main/java/org/transdroid/core/gui/TorrentTasksExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/transdroid/core/gui/TorrentTasksExecutor.java b/app/src/main/java/org/transdroid/core/gui/TorrentTasksExecutor.java index cb405ce2..dd7c5036 100644 --- a/app/src/main/java/org/transdroid/core/gui/TorrentTasksExecutor.java +++ b/app/src/main/java/org/transdroid/core/gui/TorrentTasksExecutor.java @@ -42,7 +42,7 @@ public interface TorrentTasksExecutor { void toggleSequentialDownload(Torrent torrent, boolean sequentialState); - void toggleFirstLastPieceDownload(Torrent torrent, boolean sequentialState); + void toggleFirstLastPieceDownload(Torrent torrent, boolean firstLastPieceState); void forceRecheckTorrent(Torrent torrent); From d9594260d35688a8b5c5fc1f84633ee8760f28a6 Mon Sep 17 00:00:00 2001 From: Phillip Dykman Date: Fri, 6 Dec 2019 00:01:13 -0800 Subject: [PATCH 8/9] Remove duplicates from previous commit --- app/src/main/res/values-ru/strings.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index cb9edf92..1cc49da8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -176,8 +176,6 @@ %1$s имеет %2$s приоритет первого и последнего куска обычый приоритет кусков - Изменено последовательное скачивание торрента - Изменен приоритет скачивания начала и конца торрента Проверка данных %1$s Торрент перемещен в \'%1$s\' Приоритеты файлов обновлены From c50dee31ea8404aab530eb98162454d386730106 Mon Sep 17 00:00:00 2001 From: Phillip Dykman Date: Sun, 8 Dec 2019 11:12:47 -0800 Subject: [PATCH 9/9] Fix parsing bug - seq_dl and f_l_piece_prio can be missing if the torrent is new and hasn't downloaded metadata yet --- .../transdroid/daemon/Qbittorrent/QbittorrentAdapter.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/transdroid/daemon/Qbittorrent/QbittorrentAdapter.java b/app/src/main/java/org/transdroid/daemon/Qbittorrent/QbittorrentAdapter.java index 7f693b8f..b54452b4 100644 --- a/app/src/main/java/org/transdroid/daemon/Qbittorrent/QbittorrentAdapter.java +++ b/app/src/main/java/org/transdroid/daemon/Qbittorrent/QbittorrentAdapter.java @@ -521,8 +521,12 @@ public class QbittorrentAdapter implements IDaemonAdapter { ratio = tor.getDouble("ratio"); dlspeed = tor.getInt("dlspeed"); upspeed = tor.getInt("upspeed"); - dlseq = tor.getBoolean("seq_dl"); - dlflp = tor.getBoolean("f_l_piece_prio"); + if (tor.has("seq_dl")) { + dlseq = tor.getBoolean("seq_dl"); + } + if (tor.has("f_l_piece_prio")) { + dlflp = tor.getBoolean("f_l_piece_prio"); + } if (tor.has("uploaded")) { uploaded = tor.getLong("uploaded"); } else {