summaryrefslogtreecommitdiff
path: root/core/src/main/java/de
diff options
context:
space:
mode:
authorH. Lehmann <ByteHamster@users.noreply.github.com>2020-02-05 11:52:57 +0100
committerGitHub <noreply@github.com>2020-02-05 11:52:57 +0100
commit634c98317fb4ca81557f618f2741f6479066c75d (patch)
treea4a8b3a32b7f2c156cca784a6251e78837d632f1 /core/src/main/java/de
parent80364984840ba981d6ba8a713a6483623fe6bfd6 (diff)
parent3be4f80a5cf466f92eb3844d556ad4ea784b5f06 (diff)
downloadAntennaPod-634c98317fb4ca81557f618f2741f6479066c75d.zip
Merge pull request #3830 from ByteHamster/search-podcasts
Improved search function
Diffstat (limited to 'core/src/main/java/de')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/SearchResult.java22
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java23
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java17
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java59
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java37
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/SearchLocation.java21
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/comparator/InReverseChronologicalOrder.java21
7 files changed, 65 insertions, 135 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;
- }
-}