diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineDb.java b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineDb.java index 1ae0a9153..0aba1c14e 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineDb.java +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineDb.java @@ -11,6 +11,7 @@ import java.util.List; import io.casey.musikcube.remote.Application; import io.casey.musikcube.remote.playback.StreamProxy; +import io.casey.musikcube.remote.util.Strings; import io.casey.musikcube.remote.websocket.Messages; import io.casey.musikcube.remote.websocket.SocketMessage; import io.casey.musikcube.remote.websocket.WebSocketService; @@ -65,19 +66,29 @@ public abstract class OfflineDb extends RoomDatabase { final OfflineTrackDao dao = trackDao(); final boolean countOnly = message.getBooleanOption(Messages.Key.COUNT_ONLY, false); + final String filter = message.getStringOption(Messages.Key.FILTER, ""); final JSONArray tracks = new JSONArray(); final JSONObject options = new JSONObject(); if (countOnly) { - options.put(Messages.Key.COUNT, dao.countTracks()); + final int count = Strings.empty(filter) ? dao.countTracks() : dao.countTracks(filter); + options.put(Messages.Key.COUNT, count); } else { final int offset = message.getIntOption(Messages.Key.OFFSET, -1); final int limit = message.getIntOption(Messages.Key.LIMIT, -1); - final List offlineTracks = (offset == -1 || limit == -1) - ? dao.queryTracks() : dao.queryTracks(limit, offset); + List offlineTracks; + + if (Strings.empty(filter)) { + offlineTracks = (offset == -1 || limit == -1) + ? dao.queryTracks() : dao.queryTracks(limit, offset); + } + else { + offlineTracks = (offset == -1 || limit == -1) + ? dao.queryTracks(filter) : dao.queryTracks(filter, limit, offset); + } for (final OfflineTrack track : offlineTracks) { tracks.put(track.toJSONObject()); diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrackDao.java b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrackDao.java index 671166f05..54a4ff638 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrackDao.java +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrackDao.java @@ -17,13 +17,40 @@ public interface OfflineTrackDao { "LIMIT :limit OFFSET :offset") List queryTracks(int limit, int offset); + @Query("SELECT * FROM OfflineTrack " + + "WHERE " + + " title LIKE '%'||LOWER(:filter)||'%' OR " + + " album LIKE '%'||LOWER(:filter)||'%' OR " + + " albumArtist LIKE '%'||LOWER(:filter)||'%' OR " + + " artist LIKE '%'||LOWER(:filter)||'%' " + + "ORDER BY albumArtist ASC, album ASC, trackNum ASC, TITLE ASC " + + "LIMIT :limit OFFSET :offset") + List queryTracks(String filter, int limit, int offset); + @Query("SELECT * FROM OfflineTrack " + "ORDER BY albumArtist ASC, album ASC, trackNum ASC, TITLE ASC") List queryTracks(); + @Query("SELECT * FROM OfflineTrack " + + "WHERE " + + " title LIKE '%'||LOWER(:filter)||'%' OR " + + " album LIKE '%'||LOWER(:filter)||'%' OR " + + " albumArtist LIKE '%'||LOWER(:filter)||'%' OR " + + " artist LIKE '%'||LOWER(:filter)||'%' " + + "ORDER BY albumArtist ASC, album ASC, trackNum ASC, TITLE ASC ") + List queryTracks(String filter); + @Query("SELECT COUNT(*) FROM OfflineTrack") int countTracks(); + @Query("SELECT COUNT(*) FROM OfflineTrack " + + "WHERE " + + " title LIKE '%'||LOWER(:filter)||'%' OR " + + " album LIKE '%'||LOWER(:filter)||'%' OR " + + " albumArtist LIKE '%'||LOWER(:filter)||'%' OR " + + " artist LIKE '%'||LOWER(:filter)||'%' ") + int countTracks(String filter); + @Query("SELECT DISTINCT uri FROM OfflineTrack") List queryUris();