/* * * TURTLE PLAYER * * Licensed under MIT & GPL * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE * OR OTHER DEALINGS IN THE SOFTWARE. * * Created by Edd Turtle (www.eddturtle.co.uk) * More Information @ www.turtle-player.co.uk * */ package com.turtleplayer.playlist.playorder; import android.util.Log; import com.turtleplayer.model.Track; import com.turtleplayer.persistance.framework.executor.OperationExecutor; import com.turtleplayer.persistance.framework.paging.Paging; import com.turtleplayer.persistance.framework.sort.OrderSet; import com.turtleplayer.persistance.framework.sort.SortOrder; import com.turtleplayer.persistance.source.sql.First; import com.turtleplayer.persistance.source.sqlite.QuerySqlite; import com.turtleplayer.persistance.turtle.db.TurtleDatabase; import com.turtleplayer.persistance.turtle.db.structure.Tables; import com.turtleplayer.persistance.turtle.mapping.TrackCreator; import com.turtleplayer.playlist.Playlist; public class PlayOrderSorted implements PlayOrderStrategy { private final Playlist playlist; private final TurtleDatabase db; public PlayOrderSorted(final TurtleDatabase db, final Playlist playlist) { this.playlist = playlist; this.db = db; } public Track getNext(Track currTrack) { return get(currTrack, new DefaultOrder(SortOrder.ASC)); } public Track getPrevious(Track currTrack) { return get(currTrack, new DefaultOrder(SortOrder.DESC)); } private Track get(Track ofTrack, OrderSet<? super Tables.Tracks> order) { OrderSet<? super Tables.Tracks> currOrder = order; while(!currOrder.isEmpty()) { Log.v(PlayOrderSorted.class.getName(), "Generate Paging Filters from: " + order); Log.v(PlayOrderSorted.class.getName(), "resulting in Paging Filters : " + Paging.getFilter(playlist.getCompressedFilter(), ofTrack, currOrder)); Track nextTrack = OperationExecutor.execute( db, new QuerySqlite<Tables.Tracks, Tables.Tracks, Track>( Paging.getFilter(playlist.getCompressedFilter(), ofTrack, currOrder), order, new First<Track>(Tables.TRACKS, new TrackCreator()) ) ); if(nextTrack != null){ return nextTrack; } currOrder = currOrder.removeLast(); } return null; } }