From d55301f625c4253ef6282ea5cd2f1e5e62c8a3af Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Mon, 18 Nov 2013 08:02:49 +0100 Subject: [PATCH] Allow quick multi-selection of torrents or files based on whether they are finished. --- core/res/values/strings.xml | 1 + .../core/app/settings/ServerSetting.java | 13 ++++++----- .../gui/navigation/SelectionManagerMode.java | 19 +++++++++++++-- .../SelectionModificationSpinner.java | 9 +++++--- lib/src/org/transdroid/daemon/Finishable.java | 23 +++++++++++++++++++ lib/src/org/transdroid/daemon/Torrent.java | 20 ++++++++++++++-- .../org/transdroid/daemon/TorrentFile.java | 18 ++++++++++++++- 7 files changed, 89 insertions(+), 14 deletions(-) create mode 100644 lib/src/org/transdroid/daemon/Finishable.java diff --git a/core/res/values/strings.xml b/core/res/values/strings.xml index 01c004fb..825a72e2 100644 --- a/core/res/values/strings.xml +++ b/core/res/values/strings.xml @@ -85,6 +85,7 @@ %1$d files selected Select all + Select finished Invert selection STATUS: %1$s diff --git a/core/src/org/transdroid/core/app/settings/ServerSetting.java b/core/src/org/transdroid/core/app/settings/ServerSetting.java index e6b89bc4..6c72cdab 100644 --- a/core/src/org/transdroid/core/app/settings/ServerSetting.java +++ b/core/src/org/transdroid/core/app/settings/ServerSetting.java @@ -279,14 +279,15 @@ public class ServerSetting implements SimpleListItem { // The local integer key is converted to the idString string. // The host name address used is dependent on the network that we are currently connected to (to allow a // distinct connection IP or host name when connected to a local network). - if (localNetwork != null) + if (!TextUtils.isEmpty(localNetwork)) Log.d(caller, "Creating adapter for " + name + " of type " + type.name() + ": connected to " + connectedToNetwork + " and configured local network is " + localNetwork); return new DaemonSettings(name, type, - connectedToNetwork != null && connectedToNetwork.equals(localNetwork) ? localAddress : address, - connectedToNetwork != null && connectedToNetwork.equals(localNetwork) ? localPort : port, ssl, - sslTrustAll, sslTrustKey, folder, useAuthentication, username, password, extraPass, os, downloadDir, - ftpUrl, ftpPassword, timeout, alarmOnFinishedDownload, alarmOnNewTorrent, Integer.toString(key), - isAutoGenerated); + !TextUtils.isEmpty(connectedToNetwork) && !TextUtils.isEmpty(localAddress) + && connectedToNetwork.equals(localNetwork) ? localAddress : address, + !TextUtils.isEmpty(connectedToNetwork) && connectedToNetwork.equals(localNetwork) ? localPort : port, + ssl, sslTrustAll, sslTrustKey, folder, useAuthentication, username, password, extraPass, os, + downloadDir, ftpUrl, ftpPassword, timeout, alarmOnFinishedDownload, alarmOnNewTorrent, + Integer.toString(key), isAutoGenerated); } } diff --git a/core/src/org/transdroid/core/gui/navigation/SelectionManagerMode.java b/core/src/org/transdroid/core/gui/navigation/SelectionManagerMode.java index 1f50e7f6..39315a56 100644 --- a/core/src/org/transdroid/core/gui/navigation/SelectionManagerMode.java +++ b/core/src/org/transdroid/core/gui/navigation/SelectionManagerMode.java @@ -17,6 +17,7 @@ package org.transdroid.core.gui.navigation; import org.transdroid.core.gui.navigation.SelectionModificationSpinner.OnModificationActionSelectedListener; +import org.transdroid.daemon.Finishable; import android.util.SparseBooleanArray; import android.view.ViewGroup; @@ -59,7 +60,7 @@ public class SelectionManagerMode implements MultiChoiceModeListenerCompat, OnMo public void setOnlyCheckClass(Class onlyCheckClass) { this.onlyCheckClass = onlyCheckClass; } - + @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Allow modification of selection through a spinner @@ -117,7 +118,7 @@ public class SelectionManagerMode implements MultiChoiceModeListenerCompat, OnMo * {@link ListView}. */ @Override - public void selectionAll() { + public void selectAll() { for (int i = 0; i < managedList.getAdapter().getCount(); i++) { if (managedList.getAdapter().isEnabled(i) && (onlyCheckClass == null || onlyCheckClass.isInstance(managedList.getItemAtPosition(i)))) @@ -125,4 +126,18 @@ public class SelectionManagerMode implements MultiChoiceModeListenerCompat, OnMo } } + /** + * Implements the {@link SelectionModificationSpinner}'s select finished command by checking each (enabled) item + * that represents something that is {@link Finishable} and indeed is finished; + */ + @Override + public void selectFinished() { + for (int i = 0; i < managedList.getAdapter().getCount(); i++) { + if (managedList.getAdapter().isEnabled(i) + && (onlyCheckClass == null || onlyCheckClass.isInstance(managedList.getItemAtPosition(i))) + && managedList.getItemAtPosition(i) instanceof Finishable) + managedList.setItemChecked(i, ((Finishable) managedList.getItemAtPosition(i)).isFinished()); + } + } + } diff --git a/core/src/org/transdroid/core/gui/navigation/SelectionModificationSpinner.java b/core/src/org/transdroid/core/gui/navigation/SelectionModificationSpinner.java index 2baf477b..db24ecfc 100644 --- a/core/src/org/transdroid/core/gui/navigation/SelectionModificationSpinner.java +++ b/core/src/org/transdroid/core/gui/navigation/SelectionModificationSpinner.java @@ -66,8 +66,10 @@ public class SelectionModificationSpinner extends Spinner { @Override public void setSelection(int position) { if (position == 0) { - onModificationActionSelected.selectionAll(); + onModificationActionSelected.selectAll(); } else if (position == 1) { + onModificationActionSelected.selectFinished(); + } else if (position == 2) { onModificationActionSelected.invertSelection(); } super.setSelection(position); @@ -84,6 +86,7 @@ public class SelectionModificationSpinner extends Spinner { public SelectionDropDownAdapter(Context context) { super(context, android.R.layout.simple_list_item_1, new String[] { context.getString(R.string.navigation_selectall), + context.getString(R.string.navigation_selectfinished), context.getString(R.string.navigation_invertselection) }); titleView = new TextView(getContext()); } @@ -106,9 +109,9 @@ public class SelectionModificationSpinner extends Spinner { * Interface to implement if an interface want to respond to selection modification actions. */ public interface OnModificationActionSelectedListener { + public void selectAll(); + public void selectFinished(); public void invertSelection(); - - public void selectionAll(); } } diff --git a/lib/src/org/transdroid/daemon/Finishable.java b/lib/src/org/transdroid/daemon/Finishable.java new file mode 100644 index 00000000..65d9d738 --- /dev/null +++ b/lib/src/org/transdroid/daemon/Finishable.java @@ -0,0 +1,23 @@ +package org.transdroid.daemon; + +/** + * Represents an object that has a notion of being able to start, being in progress and being able to finish, such as + * something that can be downloaded (like a torrent or a torrent file). + * @author erickok + */ +public interface Finishable { + + /** + * Whether the represented object has been started, but is not yet finished. + * @return True iif the object (like the data transfer) was started and is in progress, but was not finished yet. + */ + public boolean isStarted(); + + /** + * Whether the represented object has been finished. + * @return True iif the object (like the data transfer) was finished, which means it is no longer started or in + * progress. + */ + public boolean isFinished(); + +} diff --git a/lib/src/org/transdroid/daemon/Torrent.java b/lib/src/org/transdroid/daemon/Torrent.java index 71cb3b96..34f55fd0 100644 --- a/lib/src/org/transdroid/daemon/Torrent.java +++ b/lib/src/org/transdroid/daemon/Torrent.java @@ -29,7 +29,7 @@ import android.os.Parcelable; * @author erickok * */ -public final class Torrent implements Parcelable, Comparable { +public final class Torrent implements Parcelable, Comparable, Finishable { final private long id; final private String hash; @@ -206,7 +206,23 @@ public final class Torrent implements Parcelable, Comparable { public boolean isSeeding(boolean dormantAsInactive) { return statusCode == TorrentStatus.Seeding && (!dormantAsInactive || rateUpload > 0); } - + + /** + * {@inheritDoc} + */ + @Override + public boolean isStarted() { + return partDone > 0; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isFinished() { + return partDone >= 1; + } + /** * Indicates if the torrent can be paused at this moment * @return If it can be paused diff --git a/lib/src/org/transdroid/daemon/TorrentFile.java b/lib/src/org/transdroid/daemon/TorrentFile.java index 2c7322dc..cd2f3a06 100644 --- a/lib/src/org/transdroid/daemon/TorrentFile.java +++ b/lib/src/org/transdroid/daemon/TorrentFile.java @@ -31,7 +31,7 @@ import android.os.Parcelable; * @author erickok * */ -public final class TorrentFile implements Parcelable, Comparable { +public final class TorrentFile implements Parcelable, Comparable, Finishable { private final String key; private final String name; @@ -142,6 +142,22 @@ public final class TorrentFile implements Parcelable, Comparable { return null; } + /** + * {@inheritDoc} + */ + @Override + public boolean isStarted() { + return getPartDone() > 0; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isFinished() { + return getPartDone() >= 1; + } + @Override public String toString() { return name;