aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Jackson <daneren2005@gmail.com>2016-02-01 11:43:20 -0800
committerScott Jackson <daneren2005@gmail.com>2016-02-01 11:43:20 -0800
commita9e07def2b64b6301033c8360b5311d205af15ab (patch)
tree67fd09339bfb34b72894ecc144b05e089d826c50
parent2153ff1bee4c7826ea902b1f1fddf2d2933b2b5b (diff)
parentd93a8939cf7d327ce6f82b7c093a18f3bd5377ad (diff)
downloaddsub-a9e07def2b64b6301033c8360b5311d205af15ab.tar.gz
dsub-a9e07def2b64b6301033c8360b5311d205af15ab.tar.bz2
dsub-a9e07def2b64b6301033c8360b5311d205af15ab.zip
Merge branch 'fxthomas-better-offline-search'
-rw-r--r--app/src/main/java/github/daneren2005/dsub/domain/SearchCritera.java94
-rw-r--r--app/src/main/java/github/daneren2005/dsub/provider/DSubSearchProvider.java4
-rw-r--r--app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java29
3 files changed, 85 insertions, 42 deletions
diff --git a/app/src/main/java/github/daneren2005/dsub/domain/SearchCritera.java b/app/src/main/java/github/daneren2005/dsub/domain/SearchCritera.java
index 20d46aa0..ed2400ef 100644
--- a/app/src/main/java/github/daneren2005/dsub/domain/SearchCritera.java
+++ b/app/src/main/java/github/daneren2005/dsub/domain/SearchCritera.java
@@ -18,6 +18,8 @@
*/
package github.daneren2005.dsub.domain;
+import java.util.regex.Pattern;
+
/**
* The criteria for a music search.
*
@@ -25,31 +27,67 @@ package github.daneren2005.dsub.domain;
*/
public class SearchCritera {
- private final String query;
- private final int artistCount;
- private final int albumCount;
- private final int songCount;
-
- public SearchCritera(String query, int artistCount, int albumCount, int songCount) {
- this.query = query;
- this.artistCount = artistCount;
- this.albumCount = albumCount;
- this.songCount = songCount;
- }
-
- public String getQuery() {
- return query;
- }
-
- public int getArtistCount() {
- return artistCount;
- }
-
- public int getAlbumCount() {
- return albumCount;
- }
-
- public int getSongCount() {
- return songCount;
- }
-} \ No newline at end of file
+ private final String query;
+ private final int artistCount;
+ private final int albumCount;
+ private final int songCount;
+ private Pattern pattern;
+
+ public SearchCritera(String query, int artistCount, int albumCount, int songCount) {
+ this.query = query;
+ this.artistCount = artistCount;
+ this.albumCount = albumCount;
+ this.songCount = songCount;
+ }
+
+ public String getQuery() {
+ return query;
+ }
+
+ public int getArtistCount() {
+ return artistCount;
+ }
+
+ public int getAlbumCount() {
+ return albumCount;
+ }
+
+ public int getSongCount() {
+ return songCount;
+ }
+
+ /**
+ * Returns and caches a pattern instance that can be used to check if a
+ * string matches the query.
+ */
+ public Pattern getPattern() {
+
+ // If the pattern wasn't already cached, create a new regular expression
+ // from the search string :
+ // * Surround the search string with ".*" (match anything)
+ // * Replace spaces and wildcard '*' characters with ".*"
+ // * All other characters are properly quoted
+ if (this.pattern == null) {
+ String regex = ".*";
+ String currentPart = "";
+ for (int i = 0; i < query.length(); i++) {
+ char c = query.charAt(i);
+ if (c == '*' || c == ' ') {
+ regex += Pattern.quote(currentPart);
+ regex += ".*";
+ currentPart = "";
+ } else {
+ currentPart += c;
+ }
+ }
+ if (currentPart.length() > 0) {
+ regex += Pattern.quote(currentPart);
+ }
+
+ regex += ".*";
+ this.pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
+ }
+
+ return this.pattern;
+ }
+}
diff --git a/app/src/main/java/github/daneren2005/dsub/provider/DSubSearchProvider.java b/app/src/main/java/github/daneren2005/dsub/provider/DSubSearchProvider.java
index f91c364e..ba8c80c1 100644
--- a/app/src/main/java/github/daneren2005/dsub/provider/DSubSearchProvider.java
+++ b/app/src/main/java/github/daneren2005/dsub/provider/DSubSearchProvider.java
@@ -58,6 +58,10 @@ public class DSubSearchProvider extends ContentProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
+ if(selectionArgs[0].isEmpty()) {
+ return null;
+ }
+
String query = selectionArgs[0] + "*";
SearchResult searchResult = search(query);
return createCursor(selectionArgs[0], searchResult);
diff --git a/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java b/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java
index d14c7fd3..3048a0db 100644
--- a/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java
+++ b/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java
@@ -307,7 +307,15 @@ public class OfflineMusicService implements MusicService {
}
}
});
-
+
+ // Respect counts in search criteria
+ int artistCount = Math.min(artists.size(), criteria.getArtistCount());
+ int albumCount = Math.min(albums.size(), criteria.getAlbumCount());
+ int songCount = Math.min(songs.size(), criteria.getSongCount());
+ artists = artists.subList(0, artistCount);
+ albums = albums.subList(0, albumCount);
+ songs = songs.subList(0, songCount);
+
return new SearchResult(artists, albums, songs);
}
@@ -359,20 +367,13 @@ public class OfflineMusicService implements MusicService {
}
}
private int matchCriteria(SearchCritera criteria, String name) {
- String query = criteria.getQuery().toLowerCase();
- String[] queryParts = query.split(" ");
- String[] nameParts = name.toLowerCase().split(" ");
-
- int closeness = 0;
- for(String queryPart : queryParts) {
- for(String namePart : nameParts) {
- if(namePart.equals(queryPart)) {
- closeness++;
- }
- }
+ if (criteria.getPattern().matcher(name).matches()) {
+ return Util.getStringDistance(
+ criteria.getQuery().toLowerCase(),
+ name.toLowerCase());
+ } else {
+ return 0;
}
-
- return closeness;
}
@Override