From 764751381ac251f7a2c3d91eefcf42a9225601fa Mon Sep 17 00:00:00 2001 From: soncaokim Date: Sun, 2 Dec 2018 18:30:01 +0100 Subject: [PATCH] Add a new smart playlist "Not played lately" playlist (#613) * Add "Not played lately" playlist (#1) * Fix bad recent playlist construction (#6) * Revert History rename * Code review --- .../gramophone/loader/LastAddedLoader.java | 2 +- .../TopAndRecentlyPlayedTracksLoader.java | 23 +++++++- .../NotRecentlyPlayedPlaylist.java | 53 +++++++++++++++++++ .../gramophone/provider/HistoryStore.java | 10 ++-- .../library/pager/PlaylistsFragment.java | 2 + .../gramophone/util/PreferenceUtil.java | 17 ++++-- app/src/main/res/values/strings.xml | 2 + .../res/values/strings_activity_settings.xml | 16 ++++++ app/src/main/res/xml/pref_playlists.xml | 9 ++++ 9 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/NotRecentlyPlayedPlaylist.java diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/LastAddedLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/LastAddedLoader.java index 44364df6..76de1987 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/LastAddedLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/LastAddedLoader.java @@ -18,7 +18,7 @@ public class LastAddedLoader { } public static Cursor makeLastAddedCursor(@NonNull final Context context) { - long cutoff = PreferenceUtil.getInstance(context).getLastAddedCutoff(); + long cutoff = PreferenceUtil.getInstance(context).getLastAddedCutoffTimeSecs(); return SongLoader.makeSongCursor( context, diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/TopAndRecentlyPlayedTracksLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/TopAndRecentlyPlayedTracksLoader.java index 1c98eff7..6f9d16cd 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/TopAndRecentlyPlayedTracksLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/TopAndRecentlyPlayedTracksLoader.java @@ -19,6 +19,7 @@ package com.kabouzeid.gramophone.loader; import android.content.Context; import android.database.Cursor; import android.provider.BaseColumns; +import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -26,6 +27,8 @@ import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.provider.HistoryStore; import com.kabouzeid.gramophone.provider.SongPlayCountStore; +import com.kabouzeid.gramophone.util.PreferenceUtil; + import java.util.ArrayList; public class TopAndRecentlyPlayedTracksLoader { @@ -36,6 +39,23 @@ public class TopAndRecentlyPlayedTracksLoader { return SongLoader.getSongs(makeRecentTracksCursorAndClearUpDatabase(context)); } + @NonNull + public static ArrayList getNotRecentlyPlayedTracks +(@NonNull Context context) { + ArrayList allSongs = SongLoader.getSongs( + SongLoader.makeSongCursor( + context, + null, null, + MediaStore.Audio.Media.DATE_ADDED + " ASC")); + + ArrayList recentlyPlayedSongs = SongLoader.getSongs( + makeRecentTracksCursorAndClearUpDatabase(context)); + + allSongs.removeAll(recentlyPlayedSongs); + + return allSongs; + } + @NonNull public static ArrayList getTopTracks(@NonNull Context context) { return SongLoader.getSongs(makeTopTracksCursorAndClearUpDatabase(context)); @@ -76,7 +96,8 @@ public class TopAndRecentlyPlayedTracksLoader { @Nullable private static SortedLongCursor makeRecentTracksCursorImpl(@NonNull final Context context) { // first get the top results ids from the internal database - Cursor songs = HistoryStore.getInstance(context).queryRecentIds(); + final long cutoff = PreferenceUtil.getInstance(context).getRecentlyPlayedCutoffTimeMillis(); + Cursor songs = HistoryStore.getInstance(context).queryRecentIds(cutoff); try { return makeSortedCursor(context, songs, diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/NotRecentlyPlayedPlaylist.java b/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/NotRecentlyPlayedPlaylist.java new file mode 100644 index 00000000..28475795 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/NotRecentlyPlayedPlaylist.java @@ -0,0 +1,53 @@ +package com.kabouzeid.gramophone.model.smartplaylist; + +import android.content.Context; +import android.os.Parcel; +import android.support.annotation.NonNull; + +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader; +import com.kabouzeid.gramophone.model.Song; +import com.kabouzeid.gramophone.provider.HistoryStore; + +import java.util.ArrayList; + +/** + * @author SC (soncaokim) + */ +public class NotRecentlyPlayedPlaylist extends AbsSmartPlaylist { + + public NotRecentlyPlayedPlaylist(@NonNull Context context) { + super(context.getString(R.string.not_recently_played), R.drawable.ic_library_music_white_24dp); + } + + @NonNull + @Override + public ArrayList getSongs(@NonNull Context context) { + return TopAndRecentlyPlayedTracksLoader.getNotRecentlyPlayedTracks(context); + } + + @Override + public void clear(@NonNull Context context) { + HistoryStore.getInstance(context).clear(); + } + + + @Override + public int describeContents() { + return 0; + } + + protected NotRecentlyPlayedPlaylist(Parcel in) { + super(in); + } + + public static final Creator CREATOR = new Creator() { + public NotRecentlyPlayedPlaylist createFromParcel(Parcel source) { + return new NotRecentlyPlayedPlaylist(source); + } + + public NotRecentlyPlayedPlaylist[] newArray(int size) { + return new NotRecentlyPlayedPlaylist[size]; + } + }; +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/provider/HistoryStore.java b/app/src/main/java/com/kabouzeid/gramophone/provider/HistoryStore.java index 357be410..62346aa4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/provider/HistoryStore.java +++ b/app/src/main/java/com/kabouzeid/gramophone/provider/HistoryStore.java @@ -25,7 +25,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; public class HistoryStore extends SQLiteOpenHelper { - private static final int MAX_ITEMS_IN_DB = 100; + private static final int MAX_ITEMS_IN_DB = 5000; public static final String DATABASE_NAME = "history.db"; private static final int VERSION = 1; @@ -136,10 +136,14 @@ public class HistoryStore extends SQLiteOpenHelper { return containsId; } - public Cursor queryRecentIds() { + public Cursor queryRecentIds(long cutoff) { final SQLiteDatabase database = getReadableDatabase(); + return database.query(RecentStoreColumns.NAME, - new String[]{RecentStoreColumns.ID}, null, null, null, null, + new String[]{RecentStoreColumns.ID}, + RecentStoreColumns.TIME_PLAYED + ">?", + new String[]{String.valueOf(cutoff)}, + null, null, RecentStoreColumns.TIME_PLAYED + " DESC"); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java index 56c99691..5fda764f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java @@ -16,6 +16,7 @@ import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.smartplaylist.HistoryPlaylist; import com.kabouzeid.gramophone.model.smartplaylist.LastAddedPlaylist; import com.kabouzeid.gramophone.model.smartplaylist.MyTopTracksPlaylist; +import com.kabouzeid.gramophone.model.smartplaylist.NotRecentlyPlayedPlaylist; import java.util.ArrayList; @@ -80,6 +81,7 @@ public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragmentIgnore Media Store covers Gapless playback Reduce volume on focus loss + Recently played playlist interval Last added playlist interval Show synchronized lyrics Remember last tab @@ -174,6 +175,7 @@ Last added History My top tracks + Not recently played Remove cover Download from Last.fm Pick from local storage diff --git a/app/src/main/res/values/strings_activity_settings.xml b/app/src/main/res/values/strings_activity_settings.xml index 986a09da..b5bf7546 100644 --- a/app/src/main/res/values/strings_activity_settings.xml +++ b/app/src/main/res/values/strings_activity_settings.xml @@ -24,6 +24,22 @@ never + + @string/today + @string/this_week + @string/this_month + @string/past_three_months + @string/this_year + + + + today + this_week + this_month + past_three_months + this_year + + @string/today @string/this_week diff --git a/app/src/main/res/xml/pref_playlists.xml b/app/src/main/res/xml/pref_playlists.xml index 8ad96828..26f72e85 100644 --- a/app/src/main/res/xml/pref_playlists.xml +++ b/app/src/main/res/xml/pref_playlists.xml @@ -3,6 +3,15 @@ + +