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;