diff --git a/core/res/layout/list_item_simple.xml b/core/res/layout/list_item_simple.xml new file mode 100644 index 00000000..cc5133ab --- /dev/null +++ b/core/res/layout/list_item_simple.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/core/src/org/transdroid/core/app/search/SearchHelper.java b/core/src/org/transdroid/core/app/search/SearchHelper.java index b72cb7b8..1eca6cb5 100644 --- a/core/src/org/transdroid/core/app/search/SearchHelper.java +++ b/core/src/org/transdroid/core/app/search/SearchHelper.java @@ -7,6 +7,7 @@ import org.androidannotations.annotations.EBean; import org.androidannotations.annotations.EBean.Scope; import org.androidannotations.annotations.RootContext; +import android.content.ContentProviderClient; import android.content.Context; import android.database.Cursor; import android.net.Uri; @@ -49,8 +50,15 @@ public class SearchHelper { */ public List getAvailableSites() { - // Try to access the TorrentSitesProvider to retrieve all available in-app torrent search sites + // Try to access the TorrentSitesProvider of the Torrent Search app Uri uri = Uri.parse("content://org.transdroid.search.torrentsitesprovider/sites"); + ContentProviderClient test = context.getContentResolver().acquireContentProviderClient(uri); + if (test == null) { + // Torrent Search package is not yet installed + return null; + } + + // Query the available in-app torrent search sites Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); if (cursor.moveToFirst()) { List sites = new ArrayList(); @@ -63,7 +71,6 @@ public class SearchHelper { return sites; } - // Torrent Search package is not yet installed return null; } diff --git a/core/src/org/transdroid/core/gui/DetailsActivity.java b/core/src/org/transdroid/core/gui/DetailsActivity.java index f4b81872..18a068ed 100644 --- a/core/src/org/transdroid/core/gui/DetailsActivity.java +++ b/core/src/org/transdroid/core/gui/DetailsActivity.java @@ -101,6 +101,7 @@ public class DetailsActivity extends SherlockFragmentActivity implements Torrent @OptionsItem(resName = "action_refresh") protected void refreshScreen() { + fragmentDetails.updateIsLoading(true); refreshTorrent(); refreshTorrentDetails(); refreshTorrentFiles(); @@ -108,9 +109,7 @@ public class DetailsActivity extends SherlockFragmentActivity implements Torrent @Background protected void refreshTorrent() { - fragmentDetails.updateIsLoading(true); DaemonTaskResult result = RetrieveTask.create(currentConnection).execute(); - fragmentDetails.updateIsLoading(false); if (result instanceof RetrieveTaskSuccessResult) { onTorrentsRetrieved(((RetrieveTaskSuccessResult) result).getTorrents(), ((RetrieveTaskSuccessResult) result).getLabels()); @@ -246,6 +245,7 @@ public class DetailsActivity extends SherlockFragmentActivity implements Torrent @UiThread protected void onCommunicationError(DaemonTaskFailureResult result) { Log.i(this, result.getException().toString()); + fragmentDetails.updateIsLoading(false); Crouton.showText(this, getString(LocalTorrent.getResourceForDaemonException(result.getException())), navigationHelper.CROUTON_ERROR_STYLE); } @@ -253,6 +253,7 @@ public class DetailsActivity extends SherlockFragmentActivity implements Torrent @UiThread protected void onTorrentsRetrieved(List torrents, List labels) { // Update the details fragment + fragmentDetails.updateIsLoading(false); fragmentDetails.perhapsUpdateTorrent(torrents); } diff --git a/core/src/org/transdroid/core/gui/TorrentsActivity.java b/core/src/org/transdroid/core/gui/TorrentsActivity.java index c4e0c444..8601aaa4 100644 --- a/core/src/org/transdroid/core/gui/TorrentsActivity.java +++ b/core/src/org/transdroid/core/gui/TorrentsActivity.java @@ -325,29 +325,36 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi * If required, add torrents, switch to a specific server, etc. */ protected void handleStartIntent() { - + Intent intent = getIntent(); Uri dataUri = intent.getData(); String data = intent.getDataString(); String action = intent.getAction(); - - if (action.equals("org.transdroid.ADD_MULTIPLE")) { + + // Adding multiple torrents at the same time (as found in the Intent extras Bundle) + if (action != null && action.equals("org.transdroid.ADD_MULTIPLE")) { // Intent should have some extras pointing to possibly multiple torrents - String[] urls = intent.getStringArrayExtra("TORRENT_URLS"); - String[] titles = intent.getStringArrayExtra("TORRENT_TITLES"); - if (urls != null) { - for (int i = 0; i < urls.length; i++) { - addTorrentByUrl(urls[i], (titles != null && titles.length >= i? titles[i]: "Torrent")); - } - } - return; + String[] urls = intent.getStringArrayExtra("TORRENT_URLS"); + String[] titles = intent.getStringArrayExtra("TORRENT_TITLES"); + if (urls != null) { + for (int i = 0; i < urls.length; i++) { + addTorrentByUrl(urls[i], (titles != null && titles.length >= i ? titles[i] : "Torrent")); + } + } + return; } + + // Add a torrent from a local or remote data URI? + if (dataUri == null) + return; + // Adding a torrent from the Android downloads manager if (dataUri.getScheme() != null && dataUri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { addTorrentFromDownloads(dataUri); return; } + // Adding a torrent from http or https URL if (dataUri.getScheme().equals("http") || dataUri.getScheme().equals("https")) { String title = data.substring(data.lastIndexOf("/")); if (intent.hasExtra("TORRENT_TITLE")) { @@ -357,17 +364,19 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi return; } + // Adding a torrent from magnet URL if (dataUri.getScheme().equals("magnet")) { addTorrentByMagnetUrl(data); return; } + // Adding a local .torrent file if (dataUri.getScheme().equals("file")) { String title = data.substring(data.lastIndexOf("/")); addTorrentByFile(data, title); return; } - + } @OptionsItem(resName = "action_add_fromurl") @@ -509,7 +518,7 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi try { // Open the content uri as input stream input = getContentResolver().openInputStream(contentUri); - + // Write a temporary file with the torrent contents File tempFile = File.createTempFile("transdroid_", ".torrent", getCacheDir()); FileOutputStream output = new FileOutputStream(tempFile); diff --git a/core/src/org/transdroid/core/gui/lists/SimpleListItemAdapter.java b/core/src/org/transdroid/core/gui/lists/SimpleListItemAdapter.java index f402ab53..e6b28e54 100644 --- a/core/src/org/transdroid/core/gui/lists/SimpleListItemAdapter.java +++ b/core/src/org/transdroid/core/gui/lists/SimpleListItemAdapter.java @@ -20,7 +20,7 @@ public class SimpleListItemAdapter extends BaseAdapter { /** * Allows updating of the full data list underlying this adapter, replacing all items - * @param newItems The new list of filter items to display + * @param newItems The new list of simple list items to display */ public void update(List newItems) { this.items = newItems; diff --git a/core/src/org/transdroid/core/gui/lists/SimpleListItemView.java b/core/src/org/transdroid/core/gui/lists/SimpleListItemView.java index 884bdbb0..2caaff61 100644 --- a/core/src/org/transdroid/core/gui/lists/SimpleListItemView.java +++ b/core/src/org/transdroid/core/gui/lists/SimpleListItemView.java @@ -11,7 +11,7 @@ import android.widget.TextView; * View that represents some {@link SimpleListItem} object and simple prints out the text (in proper style) * @author Eric Kok */ -@EViewGroup(resName="list_item_filter") +@EViewGroup(resName="list_item_simple") public class SimpleListItemView extends FrameLayout { @ViewById diff --git a/core/src/org/transdroid/core/gui/log/ErrorLogSender.java b/core/src/org/transdroid/core/gui/log/ErrorLogSender.java index 26fcc129..1740c1ad 100644 --- a/core/src/org/transdroid/core/gui/log/ErrorLogSender.java +++ b/core/src/org/transdroid/core/gui/log/ErrorLogSender.java @@ -34,9 +34,13 @@ public class ErrorLogSender { body.append("\n"); body.append(navigationHelper.getAppNameAndVersion()); body.append("\n"); - body.append(serverSetting.getType().toString()); - body.append(" settings: "); - body.append(serverSetting.getHumanReadableIdentifier()); + if (serverSetting == null) { + body.append("(No server settings)"); + } else { + body.append(serverSetting.getType().toString()); + body.append(" settings: "); + body.append(serverSetting.getHumanReadableIdentifier()); + } body.append("\n\nConnection and error log:"); // Print the individual error log messages as stored in the database diff --git a/core/src/org/transdroid/core/gui/navigation/FilterListAdapter.java b/core/src/org/transdroid/core/gui/navigation/FilterListAdapter.java index 9779be75..7cab7152 100644 --- a/core/src/org/transdroid/core/gui/navigation/FilterListAdapter.java +++ b/core/src/org/transdroid/core/gui/navigation/FilterListAdapter.java @@ -6,7 +6,6 @@ import org.androidannotations.annotations.EBean; import org.androidannotations.annotations.RootContext; import org.transdroid.core.R; import org.transdroid.core.app.settings.ServerSetting; -import org.transdroid.core.gui.lists.SimpleListItemAdapter; import org.transdroid.core.gui.navigation.StatusType.StatusTypeFilter; import android.content.Context; @@ -24,9 +23,9 @@ public class FilterListAdapter extends MergeAdapter { @RootContext protected Context context; - private SimpleListItemAdapter serverItems = null; - private SimpleListItemAdapter statusTypeItems = null; - private SimpleListItemAdapter labelItems = null; + private FilterListItemAdapter serverItems = null; + private FilterListItemAdapter statusTypeItems = null; + private FilterListItemAdapter labelItems = null; private FilterSeparatorView statusTypeSeparator; private FilterSeparatorView labelSeperator; private FilterSeparatorView serverSeparator; @@ -40,7 +39,7 @@ public class FilterListAdapter extends MergeAdapter { serverSeparator = FilterSeparatorView_.build(context).setText(context.getString(R.string.navigation_servers)); serverSeparator.setVisibility(servers.isEmpty()? View.GONE: View.VISIBLE); addView(serverSeparator, false); - this.serverItems = new SimpleListItemAdapter(context, servers); + this.serverItems = new FilterListItemAdapter(context, servers); addAdapter(serverItems); } else if (this.serverItems != null && servers != null) { serverSeparator.setVisibility(serverItems.isEmpty()? View.GONE: View.VISIBLE); @@ -61,7 +60,7 @@ public class FilterListAdapter extends MergeAdapter { context.getString(R.string.navigation_status)); statusTypeSeparator.setVisibility(statusTypes.isEmpty()? View.GONE: View.VISIBLE); addView(statusTypeSeparator, false); - this.statusTypeItems = new SimpleListItemAdapter(context, statusTypes); + this.statusTypeItems = new FilterListItemAdapter(context, statusTypes); addAdapter(statusTypeItems); } else if (this.statusTypeItems != null && statusTypes != null) { statusTypeSeparator.setVisibility(statusTypeItems.isEmpty()? View.GONE: View.VISIBLE); @@ -81,7 +80,7 @@ public class FilterListAdapter extends MergeAdapter { labelSeperator = FilterSeparatorView_.build(context).setText(context.getString(R.string.navigation_labels)); labelSeperator.setVisibility(labels.isEmpty()? View.GONE: View.VISIBLE); addView(labelSeperator, false); - this.labelItems = new SimpleListItemAdapter(context, labels); + this.labelItems = new FilterListItemAdapter(context, labels); addAdapter(labelItems); } else if (this.labelItems != null && labels != null) { labelSeperator.setVisibility(labelItems.isEmpty()? View.GONE: View.VISIBLE); diff --git a/core/src/org/transdroid/core/gui/navigation/FilterListItemAdapter.java b/core/src/org/transdroid/core/gui/navigation/FilterListItemAdapter.java new file mode 100644 index 00000000..62f21212 --- /dev/null +++ b/core/src/org/transdroid/core/gui/navigation/FilterListItemAdapter.java @@ -0,0 +1,60 @@ +package org.transdroid.core.gui.navigation; + +import java.util.List; + +import org.transdroid.core.gui.lists.SimpleListItem; +import org.transdroid.core.gui.lists.SimpleListItemView; +import org.transdroid.core.gui.lists.SimpleListItemView_; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +public class FilterListItemAdapter extends BaseAdapter { + + private final Context context; + private List items; + + public FilterListItemAdapter(Context context, List items) { + this.context = context; + this.items = items; + } + + /** + * Allows updating of the full data list underlying this adapter, replacing all items + * @param newItems The new list of filter items to display + */ + public void update(List newItems) { + this.items = newItems; + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return items.size(); + } + + @Override + public SimpleListItem getItem(int position) { + return items.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + SimpleListItemView filterItemView; + if (convertView == null || !(convertView instanceof SimpleListItemView)) { + filterItemView = SimpleListItemView_.build(context); + } else { + filterItemView = (SimpleListItemView) convertView; + } + filterItemView.bind(getItem(position)); + return filterItemView; + } + +} \ No newline at end of file diff --git a/core/src/org/transdroid/core/gui/navigation/FilterListItemView.java b/core/src/org/transdroid/core/gui/navigation/FilterListItemView.java new file mode 100644 index 00000000..97165445 --- /dev/null +++ b/core/src/org/transdroid/core/gui/navigation/FilterListItemView.java @@ -0,0 +1,29 @@ +package org.transdroid.core.gui.navigation; + +import org.androidannotations.annotations.EViewGroup; +import org.androidannotations.annotations.ViewById; +import org.transdroid.core.gui.lists.SimpleListItem; + +import android.content.Context; +import android.widget.FrameLayout; +import android.widget.TextView; + +/** + * View that represents some {@link SimpleListItem} object used to represent a navigation filter item + * @author Eric Kok + */ +@EViewGroup(resName="list_item_filter") +public class FilterListItemView extends FrameLayout { + + @ViewById + protected TextView itemText; + + public FilterListItemView(Context context) { + super(context); + } + + public void bind(SimpleListItem filterItem) { + itemText.setText(filterItem.getName()); + } + +} diff --git a/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java b/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java index 3b8e3df4..81de3bae 100644 --- a/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java +++ b/core/src/org/transdroid/core/gui/settings/MainSettingsActivity.java @@ -86,6 +86,8 @@ public class MainSettingsActivity extends SherlockPreferenceActivity { ListPreference setSite = (ListPreference) findPreference("header_setsearchsite"); // Retrieve the available in-app search sites (using the Torrent Search package) List searchsites = searchHelper.getAvailableSites(); + if (searchsites == null) + searchsites = new ArrayList(); List siteNames = new ArrayList(websearches.size() + searchsites.size()); List siteValues = new ArrayList(websearches.size() + searchsites.size()); for (SearchSite searchSite : searchsites) {