diff options
Diffstat (limited to 'core/src')
8 files changed, 65 insertions, 141 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/SearchResult.java b/core/src/main/java/de/danoeh/antennapod/core/feed/SearchResult.java deleted file mode 100644 index 062a6abac..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/SearchResult.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.danoeh.antennapod.core.feed; - -import de.danoeh.antennapod.core.storage.SearchLocation; - -public class SearchResult { - private final FeedComponent component; - private SearchLocation location; - - public SearchResult(FeedComponent component, SearchLocation location) { - super(); - this.component = component; - this.location = location; - } - - public FeedComponent getComponent() { - return component; - } - - public SearchLocation getLocation() { - return location; - } -} diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 37deb6dc0..01e84d732 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -54,10 +54,10 @@ import de.danoeh.antennapod.core.event.settings.SpeedPresetChangedEvent; import de.danoeh.antennapod.core.event.settings.VolumeAdaptionChangedEvent; import de.danoeh.antennapod.core.feed.Chapter; import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedComponent; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.MediaType; -import de.danoeh.antennapod.core.feed.SearchResult; import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; @@ -1634,16 +1634,17 @@ public class PlaybackService extends MediaBrowserServiceCompat { public void onPlayFromSearch(String query, Bundle extras) { Log.d(TAG, "onPlayFromSearch query=" + query + " extras=" + extras.toString()); - List<SearchResult> results = FeedSearcher.performSearch(getBaseContext(), query, 0); - for (SearchResult result : results) { - try { - FeedMedia p = ((FeedItem) (result.getComponent())).getMedia(); - mediaPlayer.playMediaObject(p, !p.localFileAvailable(), true, true); - return; - } catch (Exception e) { - Log.d(TAG, e.getMessage()); - e.printStackTrace(); - continue; + List<FeedComponent> results = FeedSearcher.performSearch(getBaseContext(), query, 0); + for (FeedComponent result : results) { + if (result instanceof FeedItem) { + try { + FeedMedia media = ((FeedItem) result).getMedia(); + mediaPlayer.playMediaObject(media, !media.localFileAvailable(), true, true); + return; + } catch (Exception e) { + Log.d(TAG, e.getMessage()); + e.printStackTrace(); + } } } onPlay(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java index 91f656bf1..8ebe18dc0 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java @@ -553,6 +553,23 @@ public final class DBTasks { }); } + public static FutureTask<List<Feed>> searchFeeds(final Context context, final String query) { + return new FutureTask<>(new QueryTask<List<Feed>>(context) { + @Override + public void execute(PodDBAdapter adapter) { + Cursor cursor = adapter.searchFeeds(query); + List<Feed> items = new ArrayList<>(); + if (cursor.moveToFirst()) { + do { + items.add(Feed.fromCursor(cursor)); + } while (cursor.moveToNext()); + } + setResult(items); + cursor.close(); + } + }); + } + /** * A runnable which should be used for database queries. The onCompletion * method is executed on the database executor to handle Cursors correctly. diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java index 1d9e33d0e..bbe8b26f1 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java @@ -2,21 +2,15 @@ package de.danoeh.antennapod.core.storage; import android.content.Context; import androidx.annotation.NonNull; +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedComponent; +import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.Chapter; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; -import de.danoeh.antennapod.core.R; -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.SearchResult; -import de.danoeh.antennapod.core.util.comparator.InReverseChronologicalOrder; - /** * Performs search on Feeds and FeedItems. */ @@ -37,48 +31,19 @@ public class FeedSearcher { * @return list of episodes containing the query */ @NonNull - public static List<SearchResult> performSearch(final Context context, final String query, final long selectedFeed) { - final List<SearchResult> result = new ArrayList<>(); + public static List<FeedComponent> performSearch(final Context context, final String query, final long selectedFeed) { + final List<FeedComponent> result = new ArrayList<>(); try { - FutureTask<List<FeedItem>> searchTask = DBTasks.searchFeedItems(context, selectedFeed, query); - searchTask.run(); - final List<FeedItem> items = searchTask.get(); - for (FeedItem item : items) { - SearchLocation location; - if (safeContains(item.getTitle(), query)) { - location = SearchLocation.TITLE; - } else if (safeContains(item.getContentEncoded(), query)) { - location = SearchLocation.SHOWNOTES; - } else if (safeContains(item.getDescription(), query)) { - location = SearchLocation.SHOWNOTES; - } else if (safeContains(item.getChapters(), query)) { - location = SearchLocation.CHAPTERS; - } else if (safeContains(item.getFeed().getAuthor(), query)) { - location = SearchLocation.AUTHORS; - } else { - location = SearchLocation.FEED; - } - result.add(new SearchResult(item, location)); - } + FutureTask<List<FeedItem>> itemSearchTask = DBTasks.searchFeedItems(context, selectedFeed, query); + FutureTask<List<Feed>> feedSearchTask = DBTasks.searchFeeds(context, query); + itemSearchTask.run(); + feedSearchTask.run(); + + result.addAll(feedSearchTask.get()); + result.addAll(itemSearchTask.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } return result; } - - private static boolean safeContains(String haystack, String needle) { - return haystack != null && haystack.contains(needle); - } - - private static boolean safeContains(List<Chapter> haystack, String needle) { - if (haystack == null) { - return false; - } - for (Chapter chapter : haystack) { - if (safeContains(chapter.getTitle(), needle)) { - return true; - } - } - return false; - } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index ce55591ae..4e2588f22 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -285,10 +285,13 @@ public class PodDBAdapter { * Contains FEEDITEM_SEL_FI_SMALL as comma-separated list. Useful for raw queries. */ private static final String SEL_FI_SMALL_STR; + private static final String FEED_SEL_STD_STR; static { String selFiSmall = Arrays.toString(FEEDITEM_SEL_FI_SMALL); SEL_FI_SMALL_STR = selFiSmall.substring(1, selFiSmall.length() - 1); + String selFeedSmall = Arrays.toString(FEED_SEL_STD); + FEED_SEL_STD_STR = selFeedSmall.substring(1, selFeedSmall.length() - 1); } /** @@ -1275,21 +1278,29 @@ public class PodDBAdapter { } String query = "SELECT " + SEL_FI_SMALL_STR + " FROM " + TABLE_NAME_FEED_ITEMS - + " LEFT JOIN " + TABLE_NAME_SIMPLECHAPTERS - + " ON " + TABLE_NAME_SIMPLECHAPTERS + "." + KEY_FEEDITEM - + "=" + TABLE_NAME_FEED_ITEMS + "." + KEY_ID - + " LEFT JOIN " + TABLE_NAME_FEEDS - + " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_FEED - + "=" + TABLE_NAME_FEEDS + "." + KEY_ID + " WHERE " + queryFeedId + " AND (" - + TABLE_NAME_FEED_ITEMS + "." + KEY_DESCRIPTION + " LIKE '%" + preparedQuery + "%' OR " - + TABLE_NAME_FEED_ITEMS + "." + KEY_CONTENT_ENCODED + " LIKE '%" + preparedQuery + "%' OR " - + TABLE_NAME_FEED_ITEMS + "." + KEY_TITLE + " LIKE '%" + preparedQuery + "%' OR " - + TABLE_NAME_SIMPLECHAPTERS + "." + KEY_TITLE + " LIKE '%" + preparedQuery + "%' OR " - + TABLE_NAME_FEEDS + "." + KEY_AUTHOR + " LIKE '%" + preparedQuery + "%' OR " - + TABLE_NAME_FEEDS + "." + KEY_FEED_IDENTIFIER + " LIKE '%" + preparedQuery + "%'" + + KEY_DESCRIPTION + " LIKE '%" + preparedQuery + "%' OR " + + KEY_CONTENT_ENCODED + " LIKE '%" + preparedQuery + "%' OR " + + KEY_TITLE + " LIKE '%" + preparedQuery + "%'" + ") ORDER BY " + KEY_PUBDATE + " DESC " - + "LIMIT 500"; + + "LIMIT 300"; + return db.rawQuery(query, null); + } + + /** + * Searches for the given query in various values of all feeds. + * + * @return A cursor with all search results in SEL_FI_EXTRA selection. + */ + public Cursor searchFeeds(String searchQuery) { + String preparedQuery = prepareSearchQuery(searchQuery); + String query = "SELECT " + FEED_SEL_STD_STR + " FROM " + TABLE_NAME_FEEDS + " WHERE " + + KEY_TITLE + " LIKE '%" + preparedQuery + "%' OR " + + KEY_CUSTOM_TITLE + " LIKE '%" + preparedQuery + "%' OR " + + KEY_AUTHOR + " LIKE '%" + preparedQuery + "%' OR " + + KEY_DESCRIPTION + " LIKE '%" + preparedQuery + "%' " + + "ORDER BY " + KEY_TITLE + " ASC " + + "LIMIT 300"; return db.rawQuery(query, null); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/SearchLocation.java b/core/src/main/java/de/danoeh/antennapod/core/storage/SearchLocation.java deleted file mode 100644 index fabe85b2c..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/SearchLocation.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.danoeh.antennapod.core.storage; - -import androidx.annotation.StringRes; -import de.danoeh.antennapod.core.R; - -public enum SearchLocation { - TITLE(R.string.found_in_title_label), - CHAPTERS(R.string.found_in_chapters_label), - SHOWNOTES(R.string.found_in_shownotes_label), - AUTHORS(R.string.found_in_authors_label), - FEED(R.string.found_in_feeds_label); - - private int description; - SearchLocation(@StringRes int description) { - this.description = description; - } - - public @StringRes int getDescription() { - return description; - } -} diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/InReverseChronologicalOrder.java b/core/src/main/java/de/danoeh/antennapod/core/util/comparator/InReverseChronologicalOrder.java deleted file mode 100644 index 80246af8f..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/InReverseChronologicalOrder.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.danoeh.antennapod.core.util.comparator; - -import java.util.Comparator; - -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.SearchResult; - -public class InReverseChronologicalOrder implements Comparator<SearchResult> { - /** - * Compare items and sort it on chronological order. - */ - @Override - public int compare(SearchResult o1, SearchResult o2) { - if ((o1.getComponent() instanceof FeedItem) && (o2.getComponent() instanceof FeedItem)) { - FeedItem item1 = (FeedItem) o1.getComponent(); - FeedItem item2 = (FeedItem) o2.getComponent(); - return item2.getPubDate().compareTo(item1.getPubDate()); - } - return 0; - } -} diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index e0ec53cbe..e5d8247bc 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -536,14 +536,8 @@ <string name="licenses_summary">AntennaPod uses other great software</string> <!-- Search --> - <string name="search_hint">Search for episodes</string> - <string name="found_in_shownotes_label">Found in show notes</string> - <string name="found_in_chapters_label">Found in chapters</string> - <string name="found_in_authors_label">Found in author(s)</string> - <string name="found_in_feeds_label">Found in podcast</string> <string name="search_status_no_results">No results were found</string> <string name="search_label">Search</string> - <string name="found_in_title_label">Found in title</string> <string name="no_results_for_query">No results were found for \"%1$s\"</string> <!-- import and export --> |