diff --git a/core/res/layout-v11/activity_widgetconfig.xml b/core/res/layout-v11/activity_widgetconfig.xml index 9cf2564f..9d7b4a1a 100644 --- a/core/res/layout-v11/activity_widgetconfig.xml +++ b/core/res/layout-v11/activity_widgetconfig.xml @@ -93,6 +93,13 @@ android:text="@string/widget_lookfeel" android:textIsSelectable="false" /> + + . --> + + + + + + + + + + + + + + + . --> - + - + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/core/res/values-land/dimens.xml b/core/res/values-land/dimens.xml index d886114c..bbe37d8d 100644 --- a/core/res/values-land/dimens.xml +++ b/core/res/values-land/dimens.xml @@ -22,8 +22,8 @@ 1dp 2dp 19sp - 12sp - 12sp + 12dp + 12dp 53dp diff --git a/core/res/values-sw600dp/dimens.xml b/core/res/values-sw600dp/dimens.xml index 4f9b8522..95eab8d8 100644 --- a/core/res/values-sw600dp/dimens.xml +++ b/core/res/values-sw600dp/dimens.xml @@ -31,8 +31,8 @@ 2dp 5dp 25sp - 17sp - 14sp + 17dp + 14dp 63dp diff --git a/core/res/values/dimens.xml b/core/res/values/dimens.xml index a7e05008..64129c14 100644 --- a/core/res/values/dimens.xml +++ b/core/res/values/dimens.xml @@ -37,8 +37,8 @@ 2dp 3dp 21sp - 15sp - 13sp + 15dp + 13dp 53dp diff --git a/core/res/values/strings.xml b/core/res/values/strings.xml index 825a72e2..20c668cc 100644 --- a/core/res/values/strings.xml +++ b/core/res/values/strings.xml @@ -204,6 +204,7 @@ LOOK & FEEL SORT ORDER Reversed sort order + Server status instead of title Use dark theme (no preview) DONE diff --git a/core/res/xml/listwidget_info.xml b/core/res/xml/listwidget_info.xml index 685df506..27014dd5 100644 --- a/core/res/xml/listwidget_info.xml +++ b/core/res/xml/listwidget_info.xml @@ -20,7 +20,7 @@ android:initialKeyguardLayout="@layout/widget_torrents_light" android:initialLayout="@layout/widget_torrents_light" android:minHeight="110dip" - android:minResizeHeight="110dip" + android:minResizeHeight="40dip" android:minResizeWidth="110dp" android:minWidth="180dp" android:previewImage="@drawable/widget_preview" diff --git a/core/src/org/transdroid/core/app/settings/ApplicationSettings.java b/core/src/org/transdroid/core/app/settings/ApplicationSettings.java index 8cfaf12c..2a1239c2 100644 --- a/core/src/org/transdroid/core/app/settings/ApplicationSettings.java +++ b/core/src/org/transdroid/core/app/settings/ApplicationSettings.java @@ -527,10 +527,13 @@ public class ApplicationSettings { if (!prefs.contains("widget_server_" + appWidgetId)) return null; // @formatter:off - return new ListWidgetConfig(prefs.getInt("widget_server_" + appWidgetId, -1), StatusType.valueOf(prefs.getString( - "widget_status_" + appWidgetId, StatusType.ShowAll.name())), TorrentsSortBy.valueOf(prefs.getString( - "widget_sortby_" + appWidgetId, TorrentsSortBy.Alphanumeric.name())), prefs.getBoolean( - "widget_reverse_" + appWidgetId, false), prefs.getBoolean("widget_darktheme_" + appWidgetId, false)); + return new ListWidgetConfig( + prefs.getInt("widget_server_" + appWidgetId, -1), + StatusType.valueOf(prefs.getString("widget_status_" + appWidgetId, StatusType.ShowAll.name())), + TorrentsSortBy.valueOf(prefs.getString("widget_sortby_" + appWidgetId, TorrentsSortBy.Alphanumeric.name())), + prefs.getBoolean("widget_reverse_" + appWidgetId, false), + prefs.getBoolean("widget_showstatus_" + appWidgetId, false), + prefs.getBoolean("widget_darktheme_" + appWidgetId, false)); // @formatter:on } @@ -549,6 +552,7 @@ public class ApplicationSettings { edit.putString("widget_status_" + appWidgetId, settings.getStatusType().name()); edit.putString("widget_sortby_" + appWidgetId, settings.getSortBy().name()); edit.putBoolean("widget_reverse_" + appWidgetId, settings.shouldReserveSort()); + edit.putBoolean("widget_showstatus_" + appWidgetId, settings.shouldShowStatusView()); edit.putBoolean("widget_darktheme_" + appWidgetId, settings.shouldUseDarkTheme()); edit.commit(); } @@ -563,6 +567,7 @@ public class ApplicationSettings { edit.remove("widget_status_" + appWidgetId); edit.remove("widget_sortby_" + appWidgetId); edit.remove("widget_reverse_" + appWidgetId); + edit.remove("widget_showstatus_" + appWidgetId); edit.remove("widget_darktheme_" + appWidgetId); edit.commit(); } diff --git a/core/src/org/transdroid/core/widget/ListWidgetConfig.java b/core/src/org/transdroid/core/widget/ListWidgetConfig.java index bbe76b25..06249db5 100644 --- a/core/src/org/transdroid/core/widget/ListWidgetConfig.java +++ b/core/src/org/transdroid/core/widget/ListWidgetConfig.java @@ -29,14 +29,16 @@ public class ListWidgetConfig { private final StatusType statusType; private final TorrentsSortBy sortBy; private final boolean reserveSort; + private final boolean showStatusView; private final boolean useDarkTheme; public ListWidgetConfig(int serverId, StatusType statusType, TorrentsSortBy sortBy, boolean reverseSort, - boolean useDarkTheme) { + boolean showStatusView, boolean useDarkTheme) { this.serverId = serverId; this.statusType = statusType; this.sortBy = sortBy; this.reserveSort = reverseSort; + this.showStatusView = showStatusView; this.useDarkTheme = useDarkTheme; } @@ -56,6 +58,10 @@ public class ListWidgetConfig { return reserveSort; } + public boolean shouldShowStatusView() { + return showStatusView; + } + public boolean shouldUseDarkTheme() { return useDarkTheme; } diff --git a/core/src/org/transdroid/core/widget/ListWidgetConfigActivity.java b/core/src/org/transdroid/core/widget/ListWidgetConfigActivity.java index b4d8c9d8..9015d1a1 100644 --- a/core/src/org/transdroid/core/widget/ListWidgetConfigActivity.java +++ b/core/src/org/transdroid/core/widget/ListWidgetConfigActivity.java @@ -45,6 +45,7 @@ import org.transdroid.daemon.TorrentsSortBy; import org.transdroid.daemon.task.DaemonTaskResult; import org.transdroid.daemon.task.RetrieveTask; import org.transdroid.daemon.task.RetrieveTaskSuccessResult; +import org.transdroid.daemon.util.FileSizeConverter; import android.annotation.TargetApi; import android.appwidget.AppWidgetManager; @@ -71,11 +72,15 @@ public class ListWidgetConfigActivity extends SherlockActivity { @ViewById protected Spinner serverSpinner, filterSpinner, sortSpinner; @ViewById - protected CheckBox reverseorderCheckBox, darkthemeCheckBox; + protected CheckBox reverseorderCheckBox, showstatusCheckBox, darkthemeCheckBox; @ViewById protected TextView filterText, serverText, errorText; @ViewById + protected TextView downcountText, upcountText, downcountSign, upcountSign, downspeedText, upspeedText; + @ViewById protected ListView torrentsList; + @ViewById + protected View navigationView, serverstatusView; private List previewTorrents = null; // Settings and helpers @@ -122,6 +127,7 @@ public class ListWidgetConfigActivity extends SherlockActivity { sortSpinner.setAdapter(new SimpleListItemSpinnerAdapter(this, 0, sortOrders)); // TODO: Update to AndroidAnnotations 3.0 and use @CheckedChanged reverseorderCheckBox.setOnCheckedChangeListener(reverseorderCheckedChanged); + showstatusCheckBox.setOnCheckedChangeListener(showstatusCheckChanged); torrentsList.setEmptyView(errorText); // Set up action bar with a done button @@ -157,6 +163,14 @@ public class ListWidgetConfigActivity extends SherlockActivity { filterTorrents(); } }; + + protected OnCheckedChangeListener showstatusCheckChanged = new OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + navigationView.setVisibility(showstatusCheckBox.isChecked()? View.GONE: View.VISIBLE); + serverstatusView.setVisibility(showstatusCheckBox.isChecked()? View.VISIBLE: View.GONE); + } + }; @Background protected void loadTorrents() { @@ -200,8 +214,9 @@ public class ListWidgetConfigActivity extends SherlockActivity { // Get the already loaded torrents and filter and sort them ArrayList filteredTorrents = new ArrayList(previewTorrents.size()); StatusTypeFilter statusTypeFilter = (StatusTypeFilter) filterSpinner.getSelectedItem(); + boolean dormantAsInactive = systemSettings.treatDormantAsInactive(); for (Torrent torrent : previewTorrents) { - if (statusTypeFilter.matches(torrent, systemSettings.treatDormantAsInactive())) + if (statusTypeFilter.matches(torrent, dormantAsInactive)) filteredTorrents.add(torrent); } if (filteredTorrents.size() == 0) { @@ -212,6 +227,23 @@ public class ListWidgetConfigActivity extends SherlockActivity { Daemon serverType = filteredTorrents.get(0).getDaemon(); Collections .sort(filteredTorrents, new TorrentsComparator(serverType, sortBy, reverseorderCheckBox.isChecked())); + + // Update the server status count and speeds + int downcount = 0, upcount = 0, downspeed = 0, upspeed = 0; + for (Torrent torrent : previewTorrents) { + if (torrent.isDownloading(dormantAsInactive)) { + downcount++; + upcount++; + } else if (torrent.isSeeding(dormantAsInactive)) { + upcount++; + } + downspeed += torrent.getRateDownload(); + upspeed += torrent.getRateUpload(); + } + downcountText.setText(Integer.toString(downcount)); + upcountText.setText(Integer.toString(upcount)); + downspeedText.setText(FileSizeConverter.getSize(downspeed) + "/s"); + upspeedText.setText(FileSizeConverter.getSize(upspeed) + "/s"); // Finally update the widget preview with the live, filtered and sorted torrents list torrentsList.setAdapter(new ListWidgetPreviewAdapter(this, 0, filteredTorrents)); @@ -243,8 +275,10 @@ public class ListWidgetConfigActivity extends SherlockActivity { StatusType statusType = ((StatusTypeFilter) filterSpinner.getSelectedItem()).getStatusType(); TorrentsSortBy sortBy = ((SortByListItem) sortSpinner.getSelectedItem()).getSortBy(); boolean reverseSort = reverseorderCheckBox.isChecked(); + boolean showstatus = showstatusCheckBox.isChecked(); boolean useDarkTheme = darkthemeCheckBox.isChecked(); - ListWidgetConfig config = new ListWidgetConfig(server, statusType, sortBy, reverseSort, useDarkTheme); + ListWidgetConfig config = new ListWidgetConfig(server, statusType, sortBy, reverseSort, showstatus, + useDarkTheme); applicationSettings.setWidgetConfig(appWidgetId, config); // Return the widget configuration result diff --git a/core/src/org/transdroid/core/widget/ListWidgetProvider.java b/core/src/org/transdroid/core/widget/ListWidgetProvider.java index 7213e316..68ad50bc 100644 --- a/core/src/org/transdroid/core/widget/ListWidgetProvider.java +++ b/core/src/org/transdroid/core/widget/ListWidgetProvider.java @@ -19,8 +19,10 @@ package org.transdroid.core.widget; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EReceiver; import org.transdroid.core.R; -import org.transdroid.core.app.settings.*; -import org.transdroid.core.gui.*; +import org.transdroid.core.app.settings.ApplicationSettings; +import org.transdroid.core.app.settings.ApplicationSettings_; +import org.transdroid.core.app.settings.ServerSetting; +import org.transdroid.core.gui.TorrentsActivity_; import org.transdroid.core.gui.log.Log; import org.transdroid.core.service.ControlService; @@ -132,10 +134,11 @@ public class ListWidgetProvider extends AppWidgetProvider { rv.setTextViewText(R.id.error_text, context.getString(R.string.widget_loading)); // Show the server and status type filter from the widget configuration in the 'action bar' + // NOTE: The ListWidgetViewsService will eventually decide to show these labels or the server status statistics ServerSetting server = appSettings.getServerSetting(config.getServerId()); rv.setTextViewText(R.id.server_text, server.getName()); rv.setTextViewText(R.id.filter_text, config.getStatusType().getFilterItem(context).getName()); - + // Set up the START_SERVER intent for 'action bar' clicks to start Transdroid normally Intent start = new Intent(context, TorrentsActivity_.class); // start.setData(Uri.parse("intent://widget/" + appWidgetId + "/start/" + config.getServerId())); diff --git a/core/src/org/transdroid/core/widget/ListWidgetViewsService.java b/core/src/org/transdroid/core/widget/ListWidgetViewsService.java index c9102c3b..668096c8 100644 --- a/core/src/org/transdroid/core/widget/ListWidgetViewsService.java +++ b/core/src/org/transdroid/core/widget/ListWidgetViewsService.java @@ -23,7 +23,6 @@ import java.util.List; import org.androidannotations.annotations.EService; import org.transdroid.core.R; import org.transdroid.core.app.settings.*; -import org.transdroid.core.app.settings.ServerSetting; import org.transdroid.core.gui.lists.LocalTorrent; import org.transdroid.core.gui.log.Log; import org.transdroid.core.service.*; @@ -34,12 +33,14 @@ import org.transdroid.daemon.TorrentsComparator; import org.transdroid.daemon.task.DaemonTaskResult; import org.transdroid.daemon.task.RetrieveTask; import org.transdroid.daemon.task.RetrieveTaskSuccessResult; +import org.transdroid.daemon.util.FileSizeConverter; import android.annotation.TargetApi; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.os.Build; +import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService; @@ -112,7 +113,8 @@ class WidgetViewsFactory implements RemoteViewsService.RemoteViewsFactory { // We have data; filter, sort and store it to use later when getViewAt gets called SystemSettings systemSettings = SystemSettings_.getInstance_(context); ArrayList filteredTorrents = new ArrayList(); - for (Torrent torrent : ((RetrieveTaskSuccessResult) result).getTorrents()) { + List allTorrents = ((RetrieveTaskSuccessResult) result).getTorrents(); + for (Torrent torrent : allTorrents) { if (config.getStatusType().getFilterItem(context).matches(torrent, systemSettings.treatDormantAsInactive())) filteredTorrents.add(torrent); } @@ -124,6 +126,33 @@ class WidgetViewsFactory implements RemoteViewsService.RemoteViewsFactory { } torrents = filteredTorrents; + // If the user asked to show the server status statistics, we need to update the widget remote views again + RemoteViews rv = ListWidgetProvider.buildRemoteViews(context, appWidgetId, config); + if (config.shouldShowStatusView()) { + + // Update the server status count and speeds in the 'action bar' + int downcount = 0, upcount = 0, downspeed = 0, upspeed = 0; + for (Torrent torrent : torrents) { + if (torrent.isDownloading(systemSettings.treatDormantAsInactive())) { + downcount++; + upcount++; + } else if (torrent.isSeeding(systemSettings.treatDormantAsInactive())) { + upcount++; + } + downspeed += torrent.getRateDownload(); + upspeed += torrent.getRateUpload(); + } + rv.setViewVisibility(R.id.navigation_view, View.GONE); + rv.setViewVisibility(R.id.serverstatus_view, View.VISIBLE); + rv.setTextViewText(R.id.downcount_text, Integer.toString(downcount)); + rv.setTextViewText(R.id.upcount_text, Integer.toString(upcount)); + rv.setTextViewText(R.id.downspeed_text, FileSizeConverter.getSize(downspeed) + "/s"); + rv.setTextViewText(R.id.upspeed_text, FileSizeConverter.getSize(upspeed) + "/s"); + + AppWidgetManager.getInstance(context.getApplicationContext()).updateAppWidget(appWidgetId, rv); + + } + } @Override