Browse Source

Allow sorting of torrents main list.

pull/11/head
Eric Kok 12 years ago
parent
commit
8a866bc3ab
  1. 30
      core/src/org/transdroid/core/app/settings/ApplicationSettings.java
  2. 47
      core/src/org/transdroid/core/gui/TorrentsActivity.java
  3. 49
      core/src/org/transdroid/core/gui/TorrentsFragment.java
  4. 2
      core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java
  5. 2
      core/src/org/transdroid/core/gui/settings/RssfeedSettingsActivity.java
  6. 2
      core/src/org/transdroid/core/gui/settings/ServerSettingsActivity.java
  7. 2
      core/src/org/transdroid/core/gui/settings/WebsearchSettingsActivity.java
  8. 16
      lib/src/org/transdroid/daemon/TorrentsComparator.java

30
core/src/org/transdroid/core/app/settings/ApplicationSettings.java

@ -8,6 +8,7 @@ import org.androidannotations.annotations.EBean.Scope;
import org.androidannotations.annotations.RootContext; import org.androidannotations.annotations.RootContext;
import org.transdroid.daemon.Daemon; import org.transdroid.daemon.Daemon;
import org.transdroid.daemon.OS; import org.transdroid.daemon.OS;
import org.transdroid.daemon.TorrentsSortBy;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
@ -320,4 +321,33 @@ public class ApplicationSettings {
} }
/**
* Registers the torrents list sort order as being last used by the user
* @param currentSortOrder The sort order property the user selected last
* @param currentSortAscending The sort order direction that was last used
*/
public void setLastUsedSortOrder(TorrentsSortBy currentSortOrder, boolean currentSortAscending) {
prefs.edit().putInt("system_lastusedsortorder", currentSortOrder.getCode()).commit();
prefs.edit().putBoolean("system_lastusedsortdirection", currentSortAscending).commit();
}
/**
* Returns the sort order property that the user last used. Use together with {@link #getLastUsedSortDescending()} to
* get the full last used sort settings.
* @return The last used sort order enumeration value
*/
public TorrentsSortBy getLastUsedSortOrder() {
return TorrentsSortBy.getStatus(prefs.getInt("system_lastusedsortorder", TorrentsSortBy.Alphanumeric.getCode()));
}
/**
* Returns the sort order direction that the user last used. Use together with {@link #getLastUsedSortOrder()} to
* get the full last used sort settings.
* @return True if the last used sort direction was descending, false otherwise (i.e. the default ascending
* direction)
*/
public boolean getLastUsedSortDescending() {
return prefs.getBoolean("system_lastusedsortdirection", false);
}
} }

47
core/src/org/transdroid/core/gui/TorrentsActivity.java

@ -24,25 +24,18 @@ import org.transdroid.core.app.settings.ApplicationSettings;
import org.transdroid.core.app.settings.ServerSetting; import org.transdroid.core.app.settings.ServerSetting;
import org.transdroid.core.gui.lists.LocalTorrent; import org.transdroid.core.gui.lists.LocalTorrent;
import org.transdroid.core.gui.lists.SimpleListItem; import org.transdroid.core.gui.lists.SimpleListItem;
import org.transdroid.core.gui.log.Log; import org.transdroid.core.gui.log.*;
import org.transdroid.core.gui.log.Log_; import org.transdroid.core.gui.navigation.*;
import org.transdroid.core.gui.navigation.FilterListAdapter;
import org.transdroid.core.gui.navigation.FilterListAdapter_;
import org.transdroid.core.gui.navigation.FilterListDropDownAdapter;
import org.transdroid.core.gui.navigation.FilterListDropDownAdapter_;
import org.transdroid.core.gui.navigation.Label;
import org.transdroid.core.gui.navigation.NavigationFilter;
import org.transdroid.core.gui.navigation.NavigationHelper;
import org.transdroid.core.gui.navigation.StatusType;
import org.transdroid.core.gui.search.BarcodeHelper; import org.transdroid.core.gui.search.BarcodeHelper;
import org.transdroid.core.gui.search.FilePickerHelper; import org.transdroid.core.gui.search.FilePickerHelper;
import org.transdroid.core.gui.search.UrlEntryDialog; import org.transdroid.core.gui.search.UrlEntryDialog;
import org.transdroid.core.gui.settings.MainSettingsActivity_; import org.transdroid.core.gui.settings.*;
import org.transdroid.daemon.Daemon; import org.transdroid.daemon.Daemon;
import org.transdroid.daemon.IDaemonAdapter; import org.transdroid.daemon.IDaemonAdapter;
import org.transdroid.daemon.Torrent; import org.transdroid.daemon.Torrent;
import org.transdroid.daemon.TorrentDetails; import org.transdroid.daemon.TorrentDetails;
import org.transdroid.daemon.TorrentFile; import org.transdroid.daemon.TorrentFile;
import org.transdroid.daemon.TorrentsSortBy;
import org.transdroid.daemon.task.AddByFileTask; import org.transdroid.daemon.task.AddByFileTask;
import org.transdroid.daemon.task.AddByMagnetUrlTask; import org.transdroid.daemon.task.AddByMagnetUrlTask;
import org.transdroid.daemon.task.AddByUrlTask; import org.transdroid.daemon.task.AddByUrlTask;
@ -219,6 +212,7 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi
menu.findItem(R.id.action_filter).setVisible(false); menu.findItem(R.id.action_filter).setVisible(false);
menu.findItem(R.id.action_settings).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.findItem(R.id.action_settings).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.findItem(R.id.action_help).setVisible(true); menu.findItem(R.id.action_help).setVisible(true);
if (fragmentTorrents != null)
fragmentTorrents.updateConnectionStatus(false); fragmentTorrents.updateConnectionStatus(false);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
return true; return true;
@ -236,6 +230,7 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi
menu.findItem(R.id.action_filter).setVisible(true); menu.findItem(R.id.action_filter).setVisible(true);
menu.findItem(R.id.action_settings).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); menu.findItem(R.id.action_settings).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
menu.findItem(R.id.action_help).setVisible(false); menu.findItem(R.id.action_help).setVisible(false);
if (fragmentTorrents != null)
fragmentTorrents.updateConnectionStatus(true); fragmentTorrents.updateConnectionStatus(true);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
@ -463,6 +458,36 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.transdroid.org/download/"))); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.transdroid.org/download/")));
} }
@OptionsItem(resName = "action_sort_byname")
protected void sortByName() {
fragmentTorrents.sortBy(TorrentsSortBy.Alphanumeric);
}
@OptionsItem(resName = "action_sort_status")
protected void sortByStatus() {
fragmentTorrents.sortBy(TorrentsSortBy.Status);
}
@OptionsItem(resName = "action_sort_done")
protected void sortByDateDone() {
fragmentTorrents.sortBy(TorrentsSortBy.DateDone);
}
@OptionsItem(resName = "action_sort_added")
protected void sortByDateAdded() {
fragmentTorrents.sortBy(TorrentsSortBy.DateAdded);
}
@OptionsItem(resName = "action_sort_upspeed")
protected void sortByUpspeed() {
fragmentTorrents.sortBy(TorrentsSortBy.UploadSpeed);
}
@OptionsItem(resName = "action_sort_ratio")
protected void sortByRatio() {
fragmentTorrents.sortBy(TorrentsSortBy.Ratio);
}
/** /**
* Shows the a details fragment for the given torrent, either in the dedicated details fragment pane, in the same * Shows the a details fragment for the given torrent, either in the dedicated details fragment pane, in the same
* pane as the torrent list was displayed or by starting a details activity. * pane as the torrent list was displayed or by starting a details activity.

49
core/src/org/transdroid/core/gui/TorrentsFragment.java

@ -1,18 +1,24 @@
package org.transdroid.core.gui; package org.transdroid.core.gui;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.InstanceState; import org.androidannotations.annotations.InstanceState;
import org.androidannotations.annotations.ItemClick; import org.androidannotations.annotations.ItemClick;
import org.androidannotations.annotations.ViewById; import org.androidannotations.annotations.ViewById;
import org.transdroid.core.R; import org.transdroid.core.R;
import org.transdroid.core.app.settings.ApplicationSettings;
import org.transdroid.core.gui.lists.TorrentsAdapter; import org.transdroid.core.gui.lists.TorrentsAdapter;
import org.transdroid.core.gui.lists.TorrentsAdapter_; import org.transdroid.core.gui.lists.TorrentsAdapter_;
import org.transdroid.core.gui.navigation.NavigationFilter; import org.transdroid.core.gui.navigation.NavigationFilter;
import org.transdroid.daemon.Daemon;
import org.transdroid.daemon.Torrent; import org.transdroid.daemon.Torrent;
import org.transdroid.daemon.TorrentsComparator;
import org.transdroid.daemon.TorrentsSortBy;
import android.view.View; import android.view.View;
import android.widget.ProgressBar; import android.widget.ProgressBar;
@ -29,11 +35,17 @@ import com.actionbarsherlock.view.SherlockListView.MultiChoiceModeListenerCompat
public class TorrentsFragment extends SherlockFragment { public class TorrentsFragment extends SherlockFragment {
// Local data // Local data
@Bean
protected ApplicationSettings applicationSettings;
@InstanceState @InstanceState
protected ArrayList<Torrent> torrents = null; protected ArrayList<Torrent> torrents = null;
@InstanceState @InstanceState
protected NavigationFilter currentFilter = null; protected NavigationFilter currentFilter = null;
@InstanceState @InstanceState
protected TorrentsSortBy currentSortOrder = TorrentsSortBy.Alphanumeric;
@InstanceState
protected boolean currentSortDescending = false;
@InstanceState
protected boolean hasAConnection = false; protected boolean hasAConnection = false;
@InstanceState @InstanceState
protected boolean isLoading = true; protected boolean isLoading = true;
@ -54,6 +66,8 @@ public class TorrentsFragment extends SherlockFragment {
@AfterViews @AfterViews
protected void init() { protected void init() {
this.currentSortOrder = applicationSettings.getLastUsedSortOrder();
this.currentSortDescending = applicationSettings.getLastUsedSortDescending();
torrentsList.setAdapter(TorrentsAdapter_.getInstance_(getActivity())); torrentsList.setAdapter(TorrentsAdapter_.getInstance_(getActivity()));
torrentsList.setMultiChoiceModeListener(onTorrentsSelected); torrentsList.setMultiChoiceModeListener(onTorrentsSelected);
if (torrents != null) if (torrents != null)
@ -70,24 +84,47 @@ public class TorrentsFragment extends SherlockFragment {
} }
/** /**
* Clear currently visible list of torrents * Clears the currently visible list of torrents.
*/ */
public void clear() { public void clear() {
this.connectionErrorMessage = null; this.connectionErrorMessage = null;
updateTorrents(null); updateTorrents(null);
} }
/**
* Stores the new sort order (for future refreshes) and sorts the current visible list. If the given new sort
* property equals the existing property, the list sort order is reversed instead.
* @param newSortOrder The sort order that the user selected.
*/
public void sortBy(TorrentsSortBy newSortOrder) {
// Update the sort order property and direction and store this last used setting
if (this.currentSortOrder == newSortOrder) {
this.currentSortDescending = !this.currentSortDescending;
} else {
this.currentSortOrder = newSortOrder;
this.currentSortDescending = false;
}
applicationSettings.setLastUsedSortOrder(this.currentSortOrder, this.currentSortDescending);
// Get the server daemon type directly form the local list of torrents, if it's not empty
Daemon serverType = (this.torrents != null && this.torrents.size() > 0 ? this.torrents.get(0).getDaemon()
: Daemon.Transmission);
Collections.sort(this.torrents, new TorrentsComparator(serverType, this.currentSortOrder,
this.currentSortDescending));
// Show the new resorted list
applyFilter(this.currentFilter);
}
/** /**
* Apply a filter on the current list of all torrents, showing the appropriate sublist of torrents only * Apply a filter on the current list of all torrents, showing the appropriate sublist of torrents only
* @param currentFilter * @param newFilter The new filter to apply to the local list of torrents
*/ */
public void applyFilter(NavigationFilter currentFilter) { public void applyFilter(NavigationFilter newFilter) {
this.currentFilter = currentFilter; this.currentFilter = newFilter;
if (torrents != null && currentFilter != null) { if (torrents != null && newFilter != null) {
// Build a local list of torrents that match the selected navigation filter // Build a local list of torrents that match the selected navigation filter
ArrayList<Torrent> filteredTorrents = new ArrayList<Torrent>(); ArrayList<Torrent> filteredTorrents = new ArrayList<Torrent>();
for (Torrent torrent : torrents) { for (Torrent torrent : torrents) {
if (currentFilter.matches(torrent)) if (newFilter.matches(torrent))
filteredTorrents.add(torrent); filteredTorrents.add(torrent);
} }
((TorrentsAdapter) torrentsList.getAdapter()).update(filteredTorrents); ((TorrentsAdapter) torrentsList.getAdapter()).update(filteredTorrents);

2
core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java

@ -13,7 +13,7 @@ import org.transdroid.core.app.settings.ApplicationSettings;
import org.transdroid.core.app.settings.RssfeedSetting; import org.transdroid.core.app.settings.RssfeedSetting;
import org.transdroid.core.app.settings.ServerSetting; import org.transdroid.core.app.settings.ServerSetting;
import org.transdroid.core.app.settings.WebsearchSetting; import org.transdroid.core.app.settings.WebsearchSetting;
import org.transdroid.core.gui.TorrentsActivity_; import org.transdroid.core.gui.*;
import org.transdroid.core.gui.settings.RssfeedPreference.OnRssfeedClickedListener; import org.transdroid.core.gui.settings.RssfeedPreference.OnRssfeedClickedListener;
import org.transdroid.core.gui.settings.ServerPreference.OnServerClickedListener; import org.transdroid.core.gui.settings.ServerPreference.OnServerClickedListener;
import org.transdroid.core.gui.settings.WebsearchPreference.OnWebsearchClickedListener; import org.transdroid.core.gui.settings.WebsearchPreference.OnWebsearchClickedListener;

2
core/src/org/transdroid/core/gui/settings/RssfeedSettingsActivity.java

@ -4,7 +4,7 @@ import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.OptionsMenu;
import org.transdroid.core.R; import org.transdroid.core.R;
import org.transdroid.core.app.settings.ApplicationSettings_; import org.transdroid.core.app.settings.*;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Intent; import android.content.Intent;

2
core/src/org/transdroid/core/gui/settings/ServerSettingsActivity.java

@ -4,7 +4,7 @@ import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.OptionsMenu;
import org.transdroid.core.R; import org.transdroid.core.R;
import org.transdroid.core.app.settings.ApplicationSettings_; import org.transdroid.core.app.settings.*;
import org.transdroid.daemon.Daemon; import org.transdroid.daemon.Daemon;
import android.annotation.TargetApi; import android.annotation.TargetApi;

2
core/src/org/transdroid/core/gui/settings/WebsearchSettingsActivity.java

@ -4,7 +4,7 @@ import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.OptionsMenu;
import org.transdroid.core.R; import org.transdroid.core.R;
import org.transdroid.core.app.settings.ApplicationSettings_; import org.transdroid.core.app.settings.*;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Intent; import android.content.Intent;

16
lib/src/org/transdroid/daemon/TorrentsComparator.java

@ -32,24 +32,22 @@ public class TorrentsComparator implements Comparator<Torrent> {
boolean reversed; boolean reversed;
/** /**
* Instantiate a torrents comparator. The daemon object is used to check support for comparing * Instantiate a torrents comparator. The daemon type is used to check support for comparing on the set property. If
* on the set properties. If the daemon does not support the property, ascending Alphanumeric * the daemon does not support the property, Alphanumeric sorting will be used even if sorting is requested on the
* sorting will be used even if sorting is requested on the unsupported property. * unsupported property.
* @param daemon The loaded server daemon, which exposes what features and properties it supports * @param daemonType The currently loaded server daemon's type, which exposes what features and properties it supports
* @param sortBy The requested sorting property (Alphanumeric is used for unsupported properties that are requested) * @param sortBy The requested sorting property (Alphanumeric is used for unsupported properties that are requested)
* @param reversed If the sorting should be in reverse order * @param reversed If the sorting should be in reverse order
*/ */
public TorrentsComparator(IDaemonAdapter daemon, TorrentsSortBy sortBy, boolean reversed) { public TorrentsComparator(Daemon daemonType, TorrentsSortBy sortBy, boolean reversed) {
this.sortBy = sortBy; this.sortBy = sortBy;
this.reversed = reversed; this.reversed = reversed;
switch (sortBy) { if (sortBy == TorrentsSortBy.DateAdded) {
case DateAdded: if (daemonType != null && !Daemon.supportsDateAdded(daemonType)) {
if (daemon != null && !Daemon.supportsDateAdded(daemon.getType())) {
// Reset the sorting to simple Alphanumeric // Reset the sorting to simple Alphanumeric
this.sortBy = TorrentsSortBy.Alphanumeric; this.sortBy = TorrentsSortBy.Alphanumeric;
this.reversed = false; this.reversed = false;
} }
break;
} }
} }

Loading…
Cancel
Save