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) {