From 0b6ea2c9baede85335a71e823574188f0304b4d7 Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Thu, 11 Sep 2014 08:44:29 +0200 Subject: [PATCH 1/6] Fixed duplicate view IDs used that caused a crash when resuming (explicitly via the up button in the action bar). Fixes #154. --- core/res/layout-w600dp/activity_search.xml | 2 +- core/res/layout-w600dp/activity_torrents.xml | 2 +- core/res/layout-w900dp/activity_rssfeeds.xml | 4 +- core/res/layout-w900dp/activity_torrents.xml | 4 +- core/res/layout/activity_details.xml | 2 +- core/res/layout/activity_rssfeeds.xml | 2 +- core/res/layout/activity_rssitems.xml | 2 +- core/res/layout/activity_search.xml | 2 +- core/res/layout/activity_torrents.xml | 2 +- .../transdroid/core/gui/DetailsActivity.java | 2 +- .../transdroid/core/gui/TorrentsActivity.java | 78 +++++++++---------- .../core/gui/rss/RssfeedsActivity.java | 6 +- .../core/gui/rss/RssitemsActivity.java | 2 +- .../core/gui/search/SearchActivity.java | 23 +++--- 14 files changed, 64 insertions(+), 69 deletions(-) diff --git a/core/res/layout-w600dp/activity_search.xml b/core/res/layout-w600dp/activity_search.xml index 6df18868..df073660 100644 --- a/core/res/layout-w600dp/activity_search.xml +++ b/core/res/layout-w600dp/activity_search.xml @@ -32,7 +32,7 @@ android:listSelector="?attr/selectable_background_transdroid" /> lastNavigationLabels; // Contained torrent and details fragments - @FragmentById(resName = "torrent_list") + @FragmentById(resName = "torrents_fragment") protected TorrentsFragment fragmentTorrents; - @FragmentById(resName = "torrent_details") + @FragmentById(resName = "torrentdetails_fragment") protected DetailsFragment fragmentDetails; // Auto refresh task @@ -368,42 +368,38 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, super.onDestroy(); } - @TargetApi(Build.VERSION_CODES.FROYO) @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); if (navigationHelper.enableSearchUi()) { - // For Android 2.1+, add an expandable SearchView to the action bar + // Add an expandable SearchView to the action bar MenuItem item = menu.findItem(R.id.action_search); - if (android.os.Build.VERSION.SDK_INT >= 8) { - SearchView searchView = new SearchView(this); - searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); - searchView.setQueryRefinementEnabled(true); - searchView.setOnSearchClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - // Pause autorefresh - stopRefresh = true; - stopAutoRefresh(); - } - }); - // NOTE ABS's OnCloseListener is not working, hence using an OnActionExpandListener - item.setOnActionExpandListener(new OnActionExpandListener() { - @Override - public boolean onMenuItemActionExpand(MenuItem item) { - return true; - } + SearchView searchView = new SearchView(this); + searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); + searchView.setQueryRefinementEnabled(true); + searchView.setOnSearchClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + // Pause autorefresh + stopRefresh = true; + stopAutoRefresh(); + } + }); + item.setOnActionExpandListener(new OnActionExpandListener() { + @Override + public boolean onMenuItemActionExpand(MenuItem item) { + return true; + } - @Override - public boolean onMenuItemActionCollapse(MenuItem item) { - stopRefresh = false; - startAutoRefresh(); - return true; - } - }); - item.setActionView(searchView); - searchMenu = item; - } + @Override + public boolean onMenuItemActionCollapse(MenuItem item) { + stopRefresh = false; + startAutoRefresh(); + return true; + } + }); + item.setActionView(searchView); + searchMenu = item; } return true; } @@ -510,7 +506,7 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, // Clear the currently shown list of torrents and perhaps the details fragmentTorrents.clear(true, true); - if (fragmentDetails != null && fragmentDetails.getActivity() != null) { + if (fragmentDetails != null && fragmentDetails.isAdded() && fragmentDetails.getActivity() != null) { fragmentDetails.updateIsLoading(false, null); fragmentDetails.clear(); fragmentDetails.setCurrentServerSettings(server); @@ -530,7 +526,7 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, // Remember that the user last selected this applicationSettings.setLastUsedNavigationFilter(currentFilter); // Clear the details view - if (fragmentDetails != null) { + if (fragmentDetails != null && fragmentDetails.isAdded()) { fragmentDetails.updateIsLoading(false, null); fragmentDetails.clear(); } @@ -545,7 +541,7 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, private void updateFragmentVisibility(boolean hasServerSettings) { if (filtersList != null) filtersList.setVisibility(hasServerSettings ? View.VISIBLE : View.GONE); - if (fragmentDetails != null) { + if (fragmentDetails != null && fragmentDetails.isAdded()) { if (hasServerSettings) getFragmentManager().beginTransaction().show(fragmentDetails).commit(); else @@ -818,7 +814,7 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, * @param torrent The torrent to show detailed statistics for */ public void openDetails(Torrent torrent) { - if (fragmentDetails != null) { + if (fragmentDetails != null && fragmentDetails.isAdded()) { fragmentDetails.updateTorrent(torrent); } else { DetailsActivity_.intent(this).torrent(torrent).currentLabels(lastNavigationLabels) @@ -1186,7 +1182,7 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, fragmentTorrents.updateIsLoading(false); if (isCritical) { fragmentTorrents.updateError(error); - if (fragmentDetails != null) + if (fragmentDetails != null && fragmentDetails.isAdded()) fragmentDetails.updateIsLoading(false, error); } } @@ -1202,7 +1198,7 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, fragmentTorrents.updateTorrents(new ArrayList(torrents), lastNavigationLabels); // Update the details fragment if the currently shown torrent is in the newly retrieved list - if (fragmentDetails != null) { + if (fragmentDetails != null && fragmentDetails.isAdded()) { fragmentDetails.perhapsUpdateTorrent(torrents); } @@ -1214,7 +1210,7 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, // Labels are shown in the action bar spinner navigationSpinnerAdapter.updateLabels(lastNavigationLabels); } - if (fragmentDetails != null) + if (fragmentDetails != null && fragmentDetails.isAdded()) fragmentDetails.updateLabels(lastNavigationLabels); // Perhaps we were still waiting to preselect the last used filter (on a fresh application start) @@ -1244,14 +1240,14 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, @UiThread protected void onTorrentDetailsRetrieved(Torrent torrent, TorrentDetails torrentDetails) { // Update the details fragment with the new fine details for the shown torrent - if (fragmentDetails != null) + if (fragmentDetails != null && fragmentDetails.isAdded()) fragmentDetails.updateTorrentDetails(torrent, torrentDetails); } @UiThread protected void onTorrentFilesRetrieved(Torrent torrent, List torrentFiles) { // Update the details fragment with the newly retrieved list of files - if (fragmentDetails != null) + if (fragmentDetails != null && fragmentDetails.isAdded()) fragmentDetails.updateTorrentFiles(torrent, new ArrayList(torrentFiles)); } diff --git a/core/src/org/transdroid/core/gui/rss/RssfeedsActivity.java b/core/src/org/transdroid/core/gui/rss/RssfeedsActivity.java index 08666f71..15dd8112 100644 --- a/core/src/org/transdroid/core/gui/rss/RssfeedsActivity.java +++ b/core/src/org/transdroid/core/gui/rss/RssfeedsActivity.java @@ -53,9 +53,9 @@ public class RssfeedsActivity extends Activity { protected List loaders; // Contained feeds and items fragments - @FragmentById(resName = "rssfeeds_list") + @FragmentById(resName = "rssfeeds_fragment") protected RssfeedsFragment fragmentFeeds; - @FragmentById(resName = "rssitems_list") + @FragmentById(resName = "rssitems_fragment") protected RssitemsFragment fragmentItems; @Override @@ -145,7 +145,7 @@ public class RssfeedsActivity extends Activity { public void openRssfeed(RssfeedLoader loader, boolean markAsViewedNow) { // The RSS feed content was loaded and can now be shown in the dedicated fragment or a new activity - if (fragmentItems != null) { + if (fragmentItems != null && fragmentItems.isAdded()) { // If desired, update the lastViewedDate and lastViewedItemUrl of this feed in the user setting; this won't // be loaded until the RSS feeds screen in opened again. diff --git a/core/src/org/transdroid/core/gui/rss/RssitemsActivity.java b/core/src/org/transdroid/core/gui/rss/RssitemsActivity.java index 7d36e69e..30125d7e 100644 --- a/core/src/org/transdroid/core/gui/rss/RssitemsActivity.java +++ b/core/src/org/transdroid/core/gui/rss/RssitemsActivity.java @@ -41,7 +41,7 @@ public class RssitemsActivity extends Activity { @Extra protected String rssfeedName; - @FragmentById(resName = "rssitems_list") + @FragmentById(resName = "rssitems_fragment") protected RssitemsFragment fragmentItems; @Override diff --git a/core/src/org/transdroid/core/gui/search/SearchActivity.java b/core/src/org/transdroid/core/gui/search/SearchActivity.java index 390fdf8e..b3ad5d2d 100644 --- a/core/src/org/transdroid/core/gui/search/SearchActivity.java +++ b/core/src/org/transdroid/core/gui/search/SearchActivity.java @@ -29,8 +29,10 @@ import org.androidannotations.annotations.ViewById; import org.transdroid.core.R; import org.transdroid.core.app.search.SearchHelper; import org.transdroid.core.app.search.SearchSite; -import org.transdroid.core.app.settings.*; -import org.transdroid.core.gui.*; +import org.transdroid.core.app.settings.ApplicationSettings; +import org.transdroid.core.app.settings.SystemSettings_; +import org.transdroid.core.app.settings.WebsearchSetting; +import org.transdroid.core.gui.TorrentsActivity_; import org.transdroid.core.gui.navigation.NavigationHelper; import android.annotation.TargetApi; @@ -62,7 +64,7 @@ import android.widget.TextView; @OptionsMenu(resName = "activity_search") public class SearchActivity extends Activity implements OnNavigationListener { - @FragmentById(resName = "searchresults_list") + @FragmentById(resName = "searchresults_fragment") protected SearchResultsFragment fragmentResults; @ViewById protected ListView searchsitesList; @@ -141,20 +143,17 @@ public class SearchActivity extends Activity implements OnNavigationListener { } - @TargetApi(Build.VERSION_CODES.FROYO) @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); if (navigationHelper.enableSearchUi()) { - // For Android 2.1+, add an expandable SearchView to the action bar + // Add an expandable SearchView to the action bar MenuItem item = menu.findItem(R.id.action_search); - if (android.os.Build.VERSION.SDK_INT >= 8) { - final SearchView searchView = new SearchView(this); - searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); - searchView.setQueryRefinementEnabled(true); - item.setActionView(searchView); - searchMenu = item; - } + final SearchView searchView = new SearchView(this); + searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); + searchView.setQueryRefinementEnabled(true); + item.setActionView(searchView); + searchMenu = item; } return true; } From 5e39a673933cd1fe07c1866d3fbf02917e859b24 Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Thu, 11 Sep 2014 15:26:23 +0200 Subject: [PATCH 2/6] Added default server feature, with option to always ask when adding a torrent (fixes #150). Default to last used server (old behaviour). --- core/res/values/strings.xml | 4 ++ core/res/xml/pref_main.xml | 7 +- .../app/settings/ApplicationSettings.java | 66 ++++++++++++++++++- .../core/gui/ServerPickerDialog.java | 41 ++++++++++++ .../transdroid/core/gui/TorrentsActivity.java | 46 ++++++++----- .../gui/settings/MainSettingsActivity.java | 21 ++++++ 6 files changed, 166 insertions(+), 19 deletions(-) create mode 100644 core/src/org/transdroid/core/gui/ServerPickerDialog.java diff --git a/core/res/values/strings.xml b/core/res/values/strings.xml index 391908ef..cb57b27a 100644 --- a/core/res/values/strings.xml +++ b/core/res/values/strings.xml @@ -90,6 +90,7 @@ Select all Select finished Invert selection + Add torrent to… STATUS: %1$s Waiting to check… @@ -216,6 +217,9 @@ Servers Add new server Add seedbox + Default server + Last used + Ask when adding torrent Search sites Set default site Add web search site diff --git a/core/res/xml/pref_main.xml b/core/res/xml/pref_main.xml index 9fb7cff8..584b1cab 100644 --- a/core/res/xml/pref_main.xml +++ b/core/res/xml/pref_main.xml @@ -24,7 +24,12 @@ + android:order="98" /> + order) { + // Move 'up' one place to account for the removed server setting + edit.putInt("header_defaultserver", --order); + } + edit.commit(); } + /** + * Returns the settings of the server that was explicitly selected by the user to select as default or, when no + * specific default server was selected, the last used server settings. As opposed to getDefaultServerKey(int), this + * method checks whether the particular server still exists (and returns the first server if not). If no servers are + * configured, null is returned. + * @return A server settings object of the server to use by default, or null if no server is yet configured + */ + public ServerSetting getDefaultServer() { + + int defaultServer = getDefaultServerKey(); + if (defaultServer == DEFAULTSERVER_LASTUSED || defaultServer == DEFAULTSERVER_ASKONADD) { + return getLastUsedServer(); + } + + // Use the explicitly selected default server + int max = getMaxOfAllServers(); // Zero-based index, so with max == 0 there is 1 server + if (max < 0) { + // No servers configured + return null; + } + if (defaultServer < 0 || defaultServer > max) { + // Last server was never set or no longer exists + return getServerSetting(0); + } + return getServerSetting(defaultServer); + + } + + /** + * Returns the unique key of the server setting that the user selected as their default server, or code indicating + * that the last used server should be selected by default; use with getDefaultServer directly. WARNING: the + * returned string may no longer refer to a known server setting key. + * @return An integer; if it is 0 or higher it represents the unique key of a configured server setting, -2 means + * the last used server should be selected as default instead and -1 means the last used server should be + * selected by default for viewing yet it should always ask when adding a new torrent + */ + public int getDefaultServerKey() { + String defaultServer = prefs.getString("header_defaultserver", Integer.toString(DEFAULTSERVER_LASTUSED)); + try { + return Integer.parseInt(defaultServer); + } catch (NumberFormatException e) { + // This should NEVER happen but if the setting somehow is not a number, return the default + return DEFAULTSERVER_LASTUSED; + } + } + /** * Returns the settings of the server that was last used by the user. As opposed to getLastUsedServerKey(int), this * method checks whether a server was already registered as being last used and check whether the server still diff --git a/core/src/org/transdroid/core/gui/ServerPickerDialog.java b/core/src/org/transdroid/core/gui/ServerPickerDialog.java new file mode 100644 index 00000000..c1f12920 --- /dev/null +++ b/core/src/org/transdroid/core/gui/ServerPickerDialog.java @@ -0,0 +1,41 @@ +package org.transdroid.core.gui; + +import java.util.List; + +import org.transdroid.core.R; +import org.transdroid.core.app.settings.ServerSetting; + +import android.app.AlertDialog; +import android.app.DialogFragment; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; + +public class ServerPickerDialog { + + /** + * Opens a dialog that allows the selection of a configured server (manual or seedbox). The calling activity will + * receive a callback on its switchServerAndAddFromIntent(int) method. + * @param activity The torrents activity from which the picker is started (and which received the callback) + * @param serverSettings The list of all available servers, of which their names will be offered to the user to pick + * from (and its position in the list is returned to the activity) + */ + public static void startServerPicker(final TorrentsActivity activity, List serverSettings) { + final String[] serverNames = new String[serverSettings.size()]; + for (int i = 0; i < serverSettings.size(); i++) { + serverNames[i] = serverSettings.get(i).getName(); + } + new DialogFragment() { + public android.app.Dialog onCreateDialog(android.os.Bundle savedInstanceState) { + return new AlertDialog.Builder(activity).setTitle(R.string.navigation_pickserver) + .setItems(serverNames, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (activity != null) + activity.switchServerAndAddFromIntent(which); + } + }).create(); + }; + }.show(activity.getFragmentManager(), "serverpicker"); + } + +} diff --git a/core/src/org/transdroid/core/gui/TorrentsActivity.java b/core/src/org/transdroid/core/gui/TorrentsActivity.java index 39fb3154..3d6bd178 100644 --- a/core/src/org/transdroid/core/gui/TorrentsActivity.java +++ b/core/src/org/transdroid/core/gui/TorrentsActivity.java @@ -51,11 +51,6 @@ import org.transdroid.core.gui.lists.NoProgressHeaderTransformer; import org.transdroid.core.gui.lists.SimpleListItem; import org.transdroid.core.gui.log.*; import org.transdroid.core.gui.navigation.*; -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.RefreshableActivity; -import org.transdroid.core.gui.navigation.StatusType; import org.transdroid.core.gui.rss.*; import org.transdroid.core.gui.search.BarcodeHelper; import org.transdroid.core.gui.search.FilePickerHelper; @@ -236,10 +231,10 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, // Log messages from the server daemons using our singleton logger DLog.setLogger(Log_.getInstance_(this)); - // Load the last used server or a server that was explicitly supplied in the starting intent - ServerSetting lastUsed = applicationSettings.getLastUsedServer(); - if (lastUsed == null) { - // No server settings yet; + // Load the default server or a server that was explicitly supplied in the starting intent + ServerSetting defaultServer = applicationSettings.getDefaultServer(); + if (defaultServer == null) { + // No server settings yet return; } Torrent openTorrent = null; @@ -251,7 +246,7 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, Log.e(this, "Tried to start with " + ListWidgetProvider.EXTRA_SERVER + " intent but " + serverId + " is not an existing server order id"); } else { - lastUsed = applicationSettings.getServerSetting(serverId); + defaultServer = applicationSettings.getServerSetting(serverId); if (getIntent().hasExtra(ListWidgetProvider.EXTRA_TORRENT)) openTorrent = getIntent().getParcelableExtra(ListWidgetProvider.EXTRA_TORRENT); } @@ -259,12 +254,12 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, // Set this as selection in the action bar spinner; we can use the server setting key since we have stable ids // Note: skipNextOnNavigationItemSelectedCalls is used to prevent this event from triggering filterSelected - actionBar.setSelectedNavigationItem(lastUsed.getOrder() + 1); + actionBar.setSelectedNavigationItem(defaultServer.getOrder() + 1); // Connect to the last used server or a server that was explicitly supplied in the starting intent if (firstStart) { // Force first torrents refresh - filterSelected(lastUsed, true); + filterSelected(defaultServer, true); // Perhaps we can select the last used navigation filter, but only after a first refresh was completed preselectNavigationFilter = applicationSettings.getLastUsedNavigationFilter(); // Handle any start up intents @@ -276,6 +271,7 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, } } else { // Resume after instead of fully loading the torrents list; create connection and set action bar title + ServerSetting lastUsed = applicationSettings.getLastUsedServer(); currentConnection = lastUsed.createServerAdapter(connectivityHelper.getConnectedNetworkName(), this); navigationSpinnerAdapter.updateCurrentServer(currentConnection); navigationSpinnerAdapter.updateCurrentFilter(currentFilter); @@ -556,11 +552,31 @@ public class TorrentsActivity extends Activity implements OnNavigationListener, handleStartIntent(); } - /** - * If required, add torrents, switch to a specific server, etc. - */ protected void handleStartIntent() { + // For intents that come from out of the application, perhaps we can not directly add them + if (applicationSettings.getDefaultServerKey() == ApplicationSettings.DEFAULTSERVER_ASKONADD + && getIntent().getData() != null) { + // First ask which server to use before adding any intent from the extras + ServerPickerDialog.startServerPicker(this, applicationSettings.getAllServerSettings()); + return; + } + addFromIntent(); + } + + public void switchServerAndAddFromIntent(int position) { + // Callback from the ServerPickerDialog; force a connection before selecting it (in the navigation) + // Note: we can just use the list position as we have stable server setting ids + ServerSetting selectedServer = applicationSettings.getAllServerSettings().get(position); + filterSelected(selectedServer, false); + addFromIntent(); + skipNextOnNavigationItemSelectedCalls++; // Prevent this selection from launching filterSelected() again + getActionBar().setSelectedNavigationItem(position + 1); + } + /** + * If required, add torrents from the supplied intent extras. + */ + protected void addFromIntent() { Intent intent = getIntent(); Uri dataUri = intent.getData(); String data = intent.getDataString(); diff --git a/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java b/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java index 97efaba1..b0447995 100644 --- a/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java +++ b/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java @@ -110,10 +110,22 @@ public class MainSettingsActivity extends PreferenceActivity { // Add existing servers List servers = applicationSettings.getNormalServerSettings(); + String[] serverCodes = new String[servers.size() + 2]; + String[] serverNames = new String[servers.size() + 2]; + serverCodes[0] = Integer.toString(ApplicationSettings.DEFAULTSERVER_LASTUSED); // Last used + serverNames[0] = getString(R.string.pref_defaultserver_lastused); + serverCodes[1] = Integer.toString(ApplicationSettings.DEFAULTSERVER_ASKONADD); // Ask when adding + serverNames[1] = getString(R.string.pref_defaultserver_askonadd); + int s = 2; for (ServerSetting serverSetting : servers) { getPreferenceScreen().addPreference( new ServerPreference(this).setServerSetting(serverSetting).setOnServerClickedListener( onServerClicked)); + if (serverSetting.getUniqueIdentifier() != null) { + serverCodes[s] = Integer.toString(serverSetting.getOrder()); + serverNames[s] = serverSetting.getName(); + s++; + } } // Add seedboxes; serversOffset keeps an int to have all ServerSettings with unique ids, seedboxOffset is unique // only per seedbox type @@ -126,8 +138,17 @@ public class MainSettingsActivity extends PreferenceActivity { .setOnSeedboxClickedListener(onSeedboxClicked, seedboxOffset)); orderOffset++; seedboxOffset++; + if (seedbox.getUniqueIdentifier() != null) { + serverCodes[s] = Integer.toString(seedbox.getOrder()); + serverNames[s] = seedbox.getName(); + s++; + } } } + // Allow selection of the default server + ListPreference defaultServerPreference = (ListPreference) findPreference("header_defaultserver"); + defaultServerPreference.setEntries(serverNames); + defaultServerPreference.setEntryValues(serverCodes); // Add existing RSS feeds if (!enableRssUi) { From 8b5ec92f0fb5df368086b34772d4e99573bd6814 Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Thu, 11 Sep 2014 16:25:22 +0200 Subject: [PATCH 3/6] Added copy to clipboard option for file names (from CAB) and RSS items (from CAB). Fixes #145 and (partially) fixes #126. --- core/AndroidManifest.xml | 2 +- core/res/menu/fragment_details_cab.xml | 4 ++++ core/res/menu/fragment_rssitems_cab.xml | 19 ++++++++------- core/res/values/strings.xml | 1 + .../transdroid/core/gui/DetailsFragment.java | 17 +++++++++++++ .../core/gui/rss/RssitemsFragment.java | 24 ++++++++++++++++++- full/AndroidManifest.xml | 2 +- lite/AndroidManifest.xml | 2 +- 8 files changed, 58 insertions(+), 13 deletions(-) diff --git a/core/AndroidManifest.xml b/core/AndroidManifest.xml index 213dc79b..15c7bfd5 100644 --- a/core/AndroidManifest.xml +++ b/core/AndroidManifest.xml @@ -17,7 +17,7 @@ --> + diff --git a/core/res/menu/fragment_rssitems_cab.xml b/core/res/menu/fragment_rssitems_cab.xml index 07ca6b1a..6e0f14df 100644 --- a/core/res/menu/fragment_rssitems_cab.xml +++ b/core/res/menu/fragment_rssitems_cab.xml @@ -20,24 +20,25 @@ android:id="@+id/action_addall" android:icon="?attr/ic_action_new" android:showAsAction="always" - android:title="@string/action_addall" /> - + android:title="@string/action_addall"/> - + android:title="@string/action_showdetails"/> - + android:title="@string/action_openwebsite"/> - - + android:title="@string/action_useassearch"/> + + + \ No newline at end of file diff --git a/core/res/values/strings.xml b/core/res/values/strings.xml index cb57b27a..eaa7d429 100644 --- a/core/res/values/strings.xml +++ b/core/res/values/strings.xml @@ -61,6 +61,7 @@ High Remote play in VLC Download using FTP(S) + Copy to clipboard Show details Open website Use as new search diff --git a/core/src/org/transdroid/core/gui/DetailsFragment.java b/core/src/org/transdroid/core/gui/DetailsFragment.java index 7dbc940c..b17d0d57 100644 --- a/core/src/org/transdroid/core/gui/DetailsFragment.java +++ b/core/src/org/transdroid/core/gui/DetailsFragment.java @@ -52,6 +52,9 @@ import org.transdroid.daemon.TorrentFile; import android.annotation.SuppressLint; import android.app.Fragment; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.view.ActionMode; @@ -472,6 +475,20 @@ public class DetailsFragment extends Fragment implements OnTrackersUpdatedListen mode.finish(); return true; + } else if (itemId == R.id.action_copytoclipboard) { + + StringBuilder names = new StringBuilder(); + for (int f = 0; f < checked.size(); f++) { + if (f != 0) + names.append("\n"); + names.append(checked.get(f).getName()); + } + ClipboardManager clipboardManager = (ClipboardManager) getActivity().getSystemService( + Context.CLIPBOARD_SERVICE); + clipboardManager.setPrimaryClip(ClipData.newPlainText("Transdroid", names.toString())); + mode.finish(); + return true; + } else { Priority priority = Priority.Off; if (itemId == R.id.action_priority_low) diff --git a/core/src/org/transdroid/core/gui/rss/RssitemsFragment.java b/core/src/org/transdroid/core/gui/rss/RssitemsFragment.java index 8df4dbd9..5688a9fa 100644 --- a/core/src/org/transdroid/core/gui/rss/RssitemsFragment.java +++ b/core/src/org/transdroid/core/gui/rss/RssitemsFragment.java @@ -38,6 +38,9 @@ import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; import android.app.SearchManager; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -146,6 +149,7 @@ public class RssitemsFragment extends Fragment { int itemId = item.getItemId(); if (itemId == R.id.action_addall) { + // Start an Intent that adds multiple items at once, by supplying the urls and titles as string array // extras and setting the Intent action to ADD_MULTIPLE Intent intent = new Intent("org.transdroid.ADD_MULTIPLE"); @@ -160,7 +164,23 @@ public class RssitemsFragment extends Fragment { startActivity(intent); mode.finish(); return true; + + } else if (itemId == R.id.action_copytoclipboard) { + + StringBuilder names = new StringBuilder(); + for (int f = 0; f < checked.size(); f++) { + if (f != 0) + names.append("\n"); + names.append(checked.get(f).getTitle()); + } + ClipboardManager clipboardManager = (ClipboardManager) getActivity().getSystemService( + Context.CLIPBOARD_SERVICE); + clipboardManager.setPrimaryClip(ClipData.newPlainText("Transdroid", names.toString())); + mode.finish(); + return true; + } else { + // The other items only operate on one (the first) selected item if (checked.size() < 1) return false; @@ -190,7 +210,9 @@ public class RssitemsFragment extends Fragment { search.putExtra(SearchManager.QUERY, first.getTitle()); startActivity(search); } - return false; + mode.finish(); + return true; + } } diff --git a/full/AndroidManifest.xml b/full/AndroidManifest.xml index b76c25d4..cc02f828 100644 --- a/full/AndroidManifest.xml +++ b/full/AndroidManifest.xml @@ -18,7 +18,7 @@ Date: Thu, 11 Sep 2014 16:26:15 +0200 Subject: [PATCH 4/6] Fixed support for catching SEND intents in the search acitivity to handle magnet, http and https links directly and add them via Transdroid. Fixes #129. --- .../org/transdroid/core/gui/search/SearchActivity.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/org/transdroid/core/gui/search/SearchActivity.java b/core/src/org/transdroid/core/gui/search/SearchActivity.java index b3ad5d2d..1ffb3ea7 100644 --- a/core/src/org/transdroid/core/gui/search/SearchActivity.java +++ b/core/src/org/transdroid/core/gui/search/SearchActivity.java @@ -184,13 +184,17 @@ public class SearchActivity extends Activity implements OnNavigationListener { } private void handleIntent(Intent intent) { - lastUsedQuery = parseQuery(intent); + lastUsedQuery = parseQuery(intent); + // Is this actually a full HTTP URL? Then redirect this request to add the URL directly if (lastUsedQuery != null && (lastUsedQuery.startsWith("http") || lastUsedQuery.startsWith("https") || lastUsedQuery.startsWith("magnet") || lastUsedQuery.startsWith("file"))) { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(lastUsedQuery))); + // Don't broadcast this intent; we can safely assume this is intended for Transdroid only + Intent i = TorrentsActivity_.intent(this).get(); + i.setData(Uri.parse(lastUsedQuery)); + startActivity(i); finish(); return; } From f9905c804a9c1bdc9601034a31d015df48976974 Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Thu, 11 Sep 2014 17:11:27 +0200 Subject: [PATCH 5/6] Oops; fix the populating of the default server list in settings with the actual number of servers+seedboxes. --- .../gui/settings/MainSettingsActivity.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java b/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java index b0447995..765245ba 100644 --- a/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java +++ b/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java @@ -29,7 +29,7 @@ import org.transdroid.core.app.settings.ApplicationSettings; import org.transdroid.core.app.settings.RssfeedSetting; import org.transdroid.core.app.settings.ServerSetting; import org.transdroid.core.app.settings.WebsearchSetting; -import org.transdroid.core.gui.*; +import org.transdroid.core.gui.TorrentsActivity_; import org.transdroid.core.gui.navigation.NavigationHelper; import org.transdroid.core.gui.settings.OverflowPreference.OnOverflowClicked; import org.transdroid.core.gui.settings.RssfeedPreference.OnRssfeedClickedListener; @@ -108,23 +108,23 @@ public class MainSettingsActivity extends PreferenceActivity { findPreference("header_system").setOnPreferenceClickListener(onSystemSettings); findPreference("header_help").setOnPreferenceClickListener(onHelpSettings); + // Keep a list of the server codes and names (for default server selection) + List serverCodes = new ArrayList(); + List serverNames = new ArrayList(); + serverCodes.add(Integer.toString(ApplicationSettings.DEFAULTSERVER_LASTUSED)); + serverCodes.add(Integer.toString(ApplicationSettings.DEFAULTSERVER_ASKONADD)); + serverNames.add(getString(R.string.pref_defaultserver_lastused)); + serverNames.add(getString(R.string.pref_defaultserver_askonadd)); + // Add existing servers List servers = applicationSettings.getNormalServerSettings(); - String[] serverCodes = new String[servers.size() + 2]; - String[] serverNames = new String[servers.size() + 2]; - serverCodes[0] = Integer.toString(ApplicationSettings.DEFAULTSERVER_LASTUSED); // Last used - serverNames[0] = getString(R.string.pref_defaultserver_lastused); - serverCodes[1] = Integer.toString(ApplicationSettings.DEFAULTSERVER_ASKONADD); // Ask when adding - serverNames[1] = getString(R.string.pref_defaultserver_askonadd); - int s = 2; for (ServerSetting serverSetting : servers) { getPreferenceScreen().addPreference( new ServerPreference(this).setServerSetting(serverSetting).setOnServerClickedListener( onServerClicked)); if (serverSetting.getUniqueIdentifier() != null) { - serverCodes[s] = Integer.toString(serverSetting.getOrder()); - serverNames[s] = serverSetting.getName(); - s++; + serverCodes.add(Integer.toString(serverSetting.getOrder())); + serverNames.add(serverSetting.getName()); } } // Add seedboxes; serversOffset keeps an int to have all ServerSettings with unique ids, seedboxOffset is unique @@ -139,16 +139,15 @@ public class MainSettingsActivity extends PreferenceActivity { orderOffset++; seedboxOffset++; if (seedbox.getUniqueIdentifier() != null) { - serverCodes[s] = Integer.toString(seedbox.getOrder()); - serverNames[s] = seedbox.getName(); - s++; + serverCodes.add(Integer.toString(seedbox.getOrder())); + serverNames.add(seedbox.getName()); } } } // Allow selection of the default server ListPreference defaultServerPreference = (ListPreference) findPreference("header_defaultserver"); - defaultServerPreference.setEntries(serverNames); - defaultServerPreference.setEntryValues(serverCodes); + defaultServerPreference.setEntries(serverNames.toArray(new String[serverNames.size()])); + defaultServerPreference.setEntryValues(serverCodes.toArray(new String[serverCodes.size()])); // Add existing RSS feeds if (!enableRssUi) { From cb29129951a119e6d2b37647a06445f5056f3705 Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Thu, 11 Sep 2014 17:23:49 +0200 Subject: [PATCH 6/6] Updated copyright info to include 2014... :) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e0a2402e..cfd00345 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Designed and developed by [Eric Kok](eric@2312.nl) of [2312 development](http:// License ======= - Copyright 2010-2013 Eric Kok et al. + Copyright 2010-2014 Eric Kok et al. Transdroid is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by