Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 98 additions & 32 deletions app/src/main/java/org/transdroid/core/gui/TorrentsActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -430,15 +430,17 @@ public void stopAutoRefresh() {
autoRefreshTask.cancel(true);
}
autoRefreshTask = null;
}

@Override
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Manually insert the actions into the main torrent and secondary actions toolbars
torrentsToolbar.inflateMenu(R.menu.activity_torrents_main);
if (actionsToolbar.getMenu().size() == 0) {
torrentsToolbar.inflateMenu(R.menu.activity_torrents_main); if (actionsToolbar.getMenu().size() == 0) {
actionsToolbar.inflateMenu(R.menu.activity_torrents_secondary);

// Initially check the current sort order in the menu
if (applicationSettings != null) {
updateSortMenuSelection(applicationSettings.getLastUsedSortOrder(), applicationSettings.getLastUsedSortDescending());
}
}
if (navigationHelper.enableSearchUi()) {
// Add an expandable SearchView to the action bar
Expand Down Expand Up @@ -817,51 +819,115 @@ protected void openSettings() {
@OptionsItem(R.id.action_help)
protected void openHelp() {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.transdroid.org/download/")));
}

@OptionsItem(R.id.action_sort_byname)
} @OptionsItem(R.id.action_sort_byname)
protected void sortByName() {
fragmentTorrents.sortBy(TorrentsSortBy.Alphanumeric);
}

@OptionsItem(R.id.action_sort_status)
updateSortMenuSelection(TorrentsSortBy.Alphanumeric, getCurrentSortDirection(TorrentsSortBy.Alphanumeric));
} @OptionsItem(R.id.action_sort_status)
protected void sortByStatus() {
fragmentTorrents.sortBy(TorrentsSortBy.Status);
}

@OptionsItem(R.id.action_sort_done)
updateSortMenuSelection(TorrentsSortBy.Status, getCurrentSortDirection(TorrentsSortBy.Status));
} @OptionsItem(R.id.action_sort_done)
protected void sortByDateDone() {
fragmentTorrents.sortBy(TorrentsSortBy.DateDone);
}

@OptionsItem(R.id.action_sort_added)
updateSortMenuSelection(TorrentsSortBy.DateDone, getCurrentSortDirection(TorrentsSortBy.DateDone));
} @OptionsItem(R.id.action_sort_added)
protected void sortByDateAdded() {
fragmentTorrents.sortBy(TorrentsSortBy.DateAdded);
}

@OptionsItem(R.id.action_sort_percent)
updateSortMenuSelection(TorrentsSortBy.DateAdded, getCurrentSortDirection(TorrentsSortBy.DateAdded));
} @OptionsItem(R.id.action_sort_percent)
protected void sortByPercent() {
fragmentTorrents.sortBy(TorrentsSortBy.Percent);
}

@OptionsItem(R.id.action_sort_downspeed)
updateSortMenuSelection(TorrentsSortBy.Percent, getCurrentSortDirection(TorrentsSortBy.Percent));
} @OptionsItem(R.id.action_sort_downspeed)
protected void sortByDownspeed() {
fragmentTorrents.sortBy(TorrentsSortBy.DownloadSpeed);
}

@OptionsItem(R.id.action_sort_upspeed)
updateSortMenuSelection(TorrentsSortBy.DownloadSpeed, getCurrentSortDirection(TorrentsSortBy.DownloadSpeed));
} @OptionsItem(R.id.action_sort_upspeed)
protected void sortByUpspeed() {
fragmentTorrents.sortBy(TorrentsSortBy.UploadSpeed);
}

@OptionsItem(R.id.action_sort_ratio)
updateSortMenuSelection(TorrentsSortBy.UploadSpeed, getCurrentSortDirection(TorrentsSortBy.UploadSpeed));
} @OptionsItem(R.id.action_sort_ratio)
protected void sortByRatio() {
fragmentTorrents.sortBy(TorrentsSortBy.Ratio);
}

@OptionsItem(R.id.action_sort_size)
updateSortMenuSelection(TorrentsSortBy.Ratio, getCurrentSortDirection(TorrentsSortBy.Ratio));
} @OptionsItem(R.id.action_sort_size)
protected void sortBySize() {
fragmentTorrents.sortBy(TorrentsSortBy.Size);
updateSortMenuSelection(TorrentsSortBy.Size, getCurrentSortDirection(TorrentsSortBy.Size));
}/**
* Updates the checked state of sort order menu items based on current sort order
*
* @param sortOrder The currently applied sort order
* @param isDescending Whether the sort direction is descending
*/
private void updateSortMenuSelection(TorrentsSortBy sortOrder, boolean isDescending) {
Menu menu = actionsToolbar.getMenu();
if (menu == null) return;
// First, uncheck all items
menu.findItem(R.id.action_sort_byname).setChecked(false);
menu.findItem(R.id.action_sort_status).setChecked(false);
menu.findItem(R.id.action_sort_done).setChecked(false);
menu.findItem(R.id.action_sort_added).setChecked(false);
menu.findItem(R.id.action_sort_percent).setChecked(false);
menu.findItem(R.id.action_sort_downspeed).setChecked(false);
menu.findItem(R.id.action_sort_upspeed).setChecked(false);
menu.findItem(R.id.action_sort_ratio).setChecked(false);
menu.findItem(R.id.action_sort_size).setChecked(false);
// Update the sort icon based on sort direction
MenuItem sortMenuItem = menu.findItem(R.id.action_sort);
if (sortMenuItem != null) {
// Set drawable level to indicate sort direction
// Using invalidateDrawable to ensure the drawable gets redrawn
sortMenuItem.setIcon(isDescending ?
R.drawable.ic_action_sort :
R.drawable.ic_action_sort_asc);
}

// Check the currently selected item
switch (sortOrder) {
case Alphanumeric:
menu.findItem(R.id.action_sort_byname).setChecked(true);
break;
case Status:
menu.findItem(R.id.action_sort_status).setChecked(true);
break;
case DateDone:
menu.findItem(R.id.action_sort_done).setChecked(true);
break;
case DateAdded:
menu.findItem(R.id.action_sort_added).setChecked(true);
break;
case Percent:
menu.findItem(R.id.action_sort_percent).setChecked(true);
break;
case DownloadSpeed:
menu.findItem(R.id.action_sort_downspeed).setChecked(true);
break;
case UploadSpeed:
menu.findItem(R.id.action_sort_upspeed).setChecked(true);
break;
case Ratio:
menu.findItem(R.id.action_sort_ratio).setChecked(true);
break;
case Size:
menu.findItem(R.id.action_sort_size).setChecked(true);
break;
}
} /**
* Helper method to get the current sort direction for a specific sort order
* If the current sort is the same as the requested sort order, we use the current direction
* Otherwise, default to descending (true)
*
* @param sortOrder The sort order to check
* @return Whether the sort direction is descending
*/
private boolean getCurrentSortDirection(TorrentsSortBy sortOrder) {
// Use applicationSettings to get the current sort direction
if (applicationSettings.getLastUsedSortOrder() == sortOrder) {
return applicationSettings.getLastUsedSortDescending();
}
return true; // Default to descending
}

/**
Expand Down
28 changes: 22 additions & 6 deletions app/src/main/java/org/transdroid/core/gui/TorrentsFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,10 @@ public class TorrentsFragment extends Fragment implements OnLabelPickedListener
@InstanceState
protected ArrayList<Label> currentLabels;
@InstanceState
protected NavigationFilter currentNavigationFilter = null;
@InstanceState
protected NavigationFilter currentNavigationFilter = null; @InstanceState
protected TorrentsSortBy currentSortOrder = TorrentsSortBy.Alphanumeric;
@InstanceState
protected boolean currentSortDescending = false;
protected boolean currentSortDescending = true; // Default to descending
@InstanceState
protected String currentTextFilter = null;
@InstanceState
Expand Down Expand Up @@ -327,13 +326,12 @@ public void clear(boolean clearError, boolean clearFilter) {
*
* @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
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;
this.currentSortDescending = true; // Default to descending when changing sort order
}
applicationSettings.setLastUsedSortOrder(this.currentSortOrder, this.currentSortDescending);
applyAllFilters();
Expand Down Expand Up @@ -498,4 +496,22 @@ private TorrentTasksExecutor getTasksExecutor() {
return (TorrentTasksExecutor) getActivity();
}

/**
* Gets the current sort order being used for the torrents list
*
* @return The current sort order
*/
public TorrentsSortBy getCurrentSortOrder() {
return currentSortOrder;
}

/**
* Gets whether the current sort order is descending
*
* @return True if the current sort direction is descending, false if ascending
*/
public boolean isCurrentSortDescending() {
return currentSortDescending;
}

}
7 changes: 7 additions & 0 deletions app/src/main/res/drawable/ic_action_sort_asc.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_action_sort"
android:fromDegrees="180"
android:toDegrees="180"
android:pivotX="50%"
android:pivotY="50%" />
75 changes: 37 additions & 38 deletions app/src/main/res/menu/activity_torrents_secondary.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,43 +31,42 @@
android:id="@+id/action_refresh"
android:icon="@drawable/ic_action_refresh"
android:title="@string/action_refresh"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_sort"
android:icon="@drawable/ic_action_sort"
android:title="@string/action_sort"
app:showAsAction="ifRoom">
<menu>
<group android:checkableBehavior="single">
<item
android:id="@+id/action_sort_byname"
android:title="@string/action_sort_alpha" />
<item
android:id="@+id/action_sort_status"
android:title="@string/action_sort_status" />
<item
android:id="@+id/action_sort_done"
android:title="@string/action_sort_done" />
<item
android:id="@+id/action_sort_added"
android:title="@string/action_sort_added" />
<item
android:id="@+id/action_sort_percent"
android:title="@string/action_sort_percent" />
<item
android:id="@+id/action_sort_downspeed"
android:title="@string/action_sort_downspeed" />
<item
android:id="@+id/action_sort_upspeed"
android:title="@string/action_sort_upspeed" />
<item
android:id="@+id/action_sort_ratio"
android:title="@string/action_sort_ratio" />
<item
android:id="@+id/action_sort_size"
android:title="@string/action_sort_size" />
</group>
</menu>
</item>
app:showAsAction="ifRoom" /> <item
android:id="@+id/action_sort"
android:icon="@drawable/ic_action_sort"
android:title="@string/action_sort"
app:showAsAction="ifRoom">
<menu>
<group android:checkableBehavior="single">
<item
android:id="@+id/action_sort_byname"
android:title="@string/action_sort_alpha" />
<item
android:id="@+id/action_sort_status"
android:title="@string/action_sort_status" />
<item
android:id="@+id/action_sort_done"
android:title="@string/action_sort_done" />
<item
android:id="@+id/action_sort_added"
android:title="@string/action_sort_added" />
<item
android:id="@+id/action_sort_percent"
android:title="@string/action_sort_percent" />
<item
android:id="@+id/action_sort_downspeed"
android:title="@string/action_sort_downspeed" />
<item
android:id="@+id/action_sort_upspeed"
android:title="@string/action_sort_upspeed" />
<item
android:id="@+id/action_sort_ratio"
android:title="@string/action_sort_ratio" />
<item
android:id="@+id/action_sort_size"
android:title="@string/action_sort_size" />
</group>
</menu>
</item>

</menu>