Skip to content

Commit 9dbd2a3

Browse files
authored
Merge pull request #563 from naveensingh/sort_by_date_added
Allow sorting by date added
2 parents c211d0a + 8bc3f9f commit 9dbd2a3

File tree

13 files changed

+76
-42
lines changed

13 files changed

+76
-42
lines changed

app/src/main/kotlin/com/simplemobiletools/musicplayer/databases/SongsDatabase.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ abstract class SongsDatabase : RoomDatabase() {
180180
execSQL("DROP TABLE artists")
181181
execSQL("ALTER TABLE artists_new RENAME TO artists")
182182
execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_artists_id` ON `artists` (`id`)")
183+
184+
database.execSQL("ALTER TABLE tracks ADD COLUMN date_added INTEGER NOT NULL DEFAULT 0")
185+
database.execSQL("ALTER TABLE albums ADD COLUMN date_added INTEGER NOT NULL DEFAULT 0")
183186
}
184187
}
185188
}

app/src/main/kotlin/com/simplemobiletools/musicplayer/dialogs/ChangeSortingDialog.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,21 @@ class ChangeSortingDialog(val activity: Activity, val location: Int, val playlis
7676
radioItems.add(RadioItem(0, activity.getString(R.string.title), PLAYER_SORT_BY_TITLE))
7777
radioItems.add(RadioItem(1, activity.getString(R.string.artist_name), PLAYER_SORT_BY_ARTIST_TITLE))
7878
radioItems.add(RadioItem(2, activity.getString(R.string.year), PLAYER_SORT_BY_YEAR))
79+
radioItems.add(RadioItem(4, activity.getString(R.string.date_added), PLAYER_SORT_BY_DATE_ADDED))
7980
}
8081
TAB_TRACKS -> {
8182
radioItems.add(RadioItem(0, activity.getString(R.string.title), PLAYER_SORT_BY_TITLE))
8283
radioItems.add(RadioItem(1, activity.getString(R.string.artist), PLAYER_SORT_BY_ARTIST_TITLE))
8384
radioItems.add(RadioItem(2, activity.getString(R.string.duration), PLAYER_SORT_BY_DURATION))
8485
radioItems.add(RadioItem(3, activity.getString(R.string.track_number), PLAYER_SORT_BY_TRACK_ID))
86+
radioItems.add(RadioItem(4, activity.getString(R.string.date_added), PLAYER_SORT_BY_DATE_ADDED))
8587
}
8688
ACTIVITY_PLAYLIST_FOLDER -> {
8789
radioItems.add(RadioItem(0, activity.getString(R.string.title), PLAYER_SORT_BY_TITLE))
8890
radioItems.add(RadioItem(1, activity.getString(R.string.artist), PLAYER_SORT_BY_ARTIST_TITLE))
8991
radioItems.add(RadioItem(2, activity.getString(R.string.duration), PLAYER_SORT_BY_DURATION))
9092
radioItems.add(RadioItem(3, activity.getString(R.string.track_number), PLAYER_SORT_BY_TRACK_ID))
93+
radioItems.add(RadioItem(4, activity.getString(R.string.date_added), PLAYER_SORT_BY_DATE_ADDED))
9194

9295
if (playlist != null) {
9396
radioItems.add(RadioItem(4, activity.getString(R.string.custom), PLAYER_SORT_BY_CUSTOM))

app/src/main/kotlin/com/simplemobiletools/musicplayer/fragments/AlbumsFragment.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import kotlinx.android.synthetic.main.fragment_albums.view.albums_placeholder
2828

2929
// Artists -> Albums -> Tracks
3030
class AlbumsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) {
31-
private var albumsIgnoringSearch = ArrayList<Album>()
31+
private var albums = ArrayList<Album>()
3232

3333
override fun setupFragment(activity: BaseSimpleActivity) {
3434
Album.sorting = context.config.albumSorting
@@ -40,8 +40,8 @@ class AlbumsFragment(context: Context, attributeSet: AttributeSet) : MyViewPager
4040
}
4141
}
4242

43-
private fun gotAlbums(activity: BaseSimpleActivity, albums: ArrayList<Album>) {
44-
albumsIgnoringSearch = albums
43+
private fun gotAlbums(activity: BaseSimpleActivity, cachedAlbums: ArrayList<Album>) {
44+
albums = cachedAlbums
4545

4646
activity.runOnUiThread {
4747
val scanning = activity.mediaScanner.isScanning()
@@ -81,20 +81,19 @@ class AlbumsFragment(context: Context, attributeSet: AttributeSet) : MyViewPager
8181
}
8282

8383
override fun onSearchQueryChanged(text: String) {
84-
val filtered = albumsIgnoringSearch.filter { it.title.contains(text, true) }.toMutableList() as ArrayList<Album>
84+
val filtered = albums.filter { it.title.contains(text, true) }.toMutableList() as ArrayList<Album>
8585
(albums_list.adapter as? AlbumsAdapter)?.updateItems(filtered, text)
8686
albums_placeholder.beVisibleIf(filtered.isEmpty())
8787
}
8888

8989
override fun onSearchClosed() {
90-
(albums_list.adapter as? AlbumsAdapter)?.updateItems(albumsIgnoringSearch)
91-
albums_placeholder.beGoneIf(albumsIgnoringSearch.isNotEmpty())
90+
(albums_list.adapter as? AlbumsAdapter)?.updateItems(albums)
91+
albums_placeholder.beGoneIf(albums.isNotEmpty())
9292
}
9393

9494
override fun onSortOpen(activity: SimpleActivity) {
9595
ChangeSortingDialog(activity, TAB_ALBUMS) {
9696
val adapter = albums_list.adapter as? AlbumsAdapter ?: return@ChangeSortingDialog
97-
val albums = adapter.albums
9897
Album.sorting = activity.config.albumSorting
9998
albums.sort()
10099
adapter.updateItems(albums, forceUpdate = true)

app/src/main/kotlin/com/simplemobiletools/musicplayer/fragments/ArtistsFragment.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import kotlinx.android.synthetic.main.fragment_artists.view.artists_placeholder
2828

2929
// Artists -> Albums -> Tracks
3030
class ArtistsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) {
31-
private var artistsIgnoringSearch = ArrayList<Artist>()
31+
private var artists = ArrayList<Artist>()
3232

3333
override fun setupFragment(activity: BaseSimpleActivity) {
3434
Artist.sorting = context.config.artistSorting
@@ -40,8 +40,8 @@ class ArtistsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
4040
}
4141
}
4242

43-
private fun gotArtists(activity: BaseSimpleActivity, artists: ArrayList<Artist>) {
44-
artistsIgnoringSearch = artists
43+
private fun gotArtists(activity: BaseSimpleActivity, cachedArtists: ArrayList<Artist>) {
44+
artists = cachedArtists
4545
activity.runOnUiThread {
4646
val scanning = activity.mediaScanner.isScanning()
4747
artists_placeholder.text = if (scanning) {
@@ -80,20 +80,19 @@ class ArtistsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
8080
}
8181

8282
override fun onSearchQueryChanged(text: String) {
83-
val filtered = artistsIgnoringSearch.filter { it.title.contains(text, true) }.toMutableList() as ArrayList<Artist>
83+
val filtered = artists.filter { it.title.contains(text, true) }.toMutableList() as ArrayList<Artist>
8484
(artists_list.adapter as? ArtistsAdapter)?.updateItems(filtered, text)
8585
artists_placeholder.beVisibleIf(filtered.isEmpty())
8686
}
8787

8888
override fun onSearchClosed() {
89-
(artists_list.adapter as? ArtistsAdapter)?.updateItems(artistsIgnoringSearch)
90-
artists_placeholder.beGoneIf(artistsIgnoringSearch.isNotEmpty())
89+
(artists_list.adapter as? ArtistsAdapter)?.updateItems(artists)
90+
artists_placeholder.beGoneIf(artists.isNotEmpty())
9191
}
9292

9393
override fun onSortOpen(activity: SimpleActivity) {
9494
ChangeSortingDialog(activity, TAB_ARTISTS) {
9595
val adapter = artists_list.adapter as? ArtistsAdapter ?: return@ChangeSortingDialog
96-
val artists = adapter.artists
9796
Artist.sorting = activity.config.artistSorting
9897
artists.sort()
9998
adapter.updateItems(artists, forceUpdate = true)

app/src/main/kotlin/com/simplemobiletools/musicplayer/fragments/FoldersFragment.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@ import com.simplemobiletools.musicplayer.extensions.mediaScanner
1919
import com.simplemobiletools.musicplayer.helpers.FOLDER
2020
import com.simplemobiletools.musicplayer.helpers.TAB_FOLDERS
2121
import com.simplemobiletools.musicplayer.models.Folder
22-
import com.simplemobiletools.musicplayer.models.Track
2322
import kotlinx.android.synthetic.main.fragment_folders.view.folders_fastscroller
2423
import kotlinx.android.synthetic.main.fragment_folders.view.folders_list
2524
import kotlinx.android.synthetic.main.fragment_folders.view.folders_placeholder
2625
import kotlinx.android.synthetic.main.fragment_folders.view.folders_placeholder_2
2726

2827
class FoldersFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) {
29-
private var foldersIgnoringSearch = ArrayList<Folder>()
28+
private var folders = ArrayList<Folder>()
3029

3130
override fun setupFragment(activity: BaseSimpleActivity) {
3231
ensureBackgroundThread {
@@ -70,7 +69,7 @@ class FoldersFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
7069

7170
Folder.sorting = activity.config.folderSorting
7271
folders.sort()
73-
foldersIgnoringSearch = folders
72+
this.folders = folders
7473

7574
val adapter = folders_list.adapter
7675
if (adapter == null) {
@@ -99,20 +98,19 @@ class FoldersFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
9998
}
10099

101100
override fun onSearchQueryChanged(text: String) {
102-
val filtered = foldersIgnoringSearch.filter { it.title.contains(text, true) }.toMutableList() as ArrayList<Folder>
101+
val filtered = folders.filter { it.title.contains(text, true) }.toMutableList() as ArrayList<Folder>
103102
(folders_list.adapter as? FoldersAdapter)?.updateItems(filtered, text)
104103
folders_placeholder.beVisibleIf(filtered.isEmpty())
105104
}
106105

107106
override fun onSearchClosed() {
108-
(folders_list.adapter as? FoldersAdapter)?.updateItems(foldersIgnoringSearch)
109-
folders_placeholder.beGoneIf(foldersIgnoringSearch.isNotEmpty())
107+
(folders_list.adapter as? FoldersAdapter)?.updateItems(folders)
108+
folders_placeholder.beGoneIf(folders.isNotEmpty())
110109
}
111110

112111
override fun onSortOpen(activity: SimpleActivity) {
113112
ChangeSortingDialog(activity, TAB_FOLDERS) {
114113
val adapter = folders_list.adapter as? FoldersAdapter ?: return@ChangeSortingDialog
115-
val folders = adapter.folders
116114
Folder.sorting = activity.config.folderSorting
117115
folders.sort()
118116
adapter.updateItems(folders, forceUpdate = true)

app/src/main/kotlin/com/simplemobiletools/musicplayer/fragments/PlaylistsFragment.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import kotlinx.android.synthetic.main.fragment_playlists.view.playlists_placehol
2828
import org.greenrobot.eventbus.EventBus
2929

3030
class PlaylistsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) {
31-
private var playlistsIgnoringSearch = ArrayList<Playlist>()
31+
private var playlists = ArrayList<Playlist>()
3232

3333
override fun setupFragment(activity: BaseSimpleActivity) {
3434
playlists_placeholder_2.underlineText()
@@ -46,7 +46,7 @@ class PlaylistsFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
4646

4747
Playlist.sorting = context.config.playlistSorting
4848
playlists.sort()
49-
playlistsIgnoringSearch = playlists
49+
this.playlists = playlists
5050

5151
activity.runOnUiThread {
5252
val scanning = activity.mediaScanner.isScanning()
@@ -85,22 +85,21 @@ class PlaylistsFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
8585
}
8686

8787
override fun onSearchQueryChanged(text: String) {
88-
val filtered = playlistsIgnoringSearch.filter { it.title.contains(text, true) }.toMutableList() as ArrayList<Playlist>
88+
val filtered = playlists.filter { it.title.contains(text, true) }.toMutableList() as ArrayList<Playlist>
8989
(playlists_list.adapter as? PlaylistsAdapter)?.updateItems(filtered, text)
9090
playlists_placeholder.beVisibleIf(filtered.isEmpty())
9191
playlists_placeholder_2.beVisibleIf(filtered.isEmpty())
9292
}
9393

9494
override fun onSearchClosed() {
95-
(playlists_list.adapter as? PlaylistsAdapter)?.updateItems(playlistsIgnoringSearch)
96-
playlists_placeholder.beGoneIf(playlistsIgnoringSearch.isNotEmpty())
97-
playlists_placeholder_2.beGoneIf(playlistsIgnoringSearch.isNotEmpty())
95+
(playlists_list.adapter as? PlaylistsAdapter)?.updateItems(playlists)
96+
playlists_placeholder.beGoneIf(playlists.isNotEmpty())
97+
playlists_placeholder_2.beGoneIf(playlists.isNotEmpty())
9898
}
9999

100100
override fun onSortOpen(activity: SimpleActivity) {
101101
ChangeSortingDialog(activity, TAB_PLAYLISTS) {
102102
val adapter = playlists_list.adapter as? PlaylistsAdapter ?: return@ChangeSortingDialog
103-
val playlists = adapter.playlists
104103
Playlist.sorting = activity.config.playlistSorting
105104
playlists.sort()
106105
adapter.updateItems(playlists, forceUpdate = true)

app/src/main/kotlin/com/simplemobiletools/musicplayer/fragments/TracksFragment.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,14 @@ class TracksFragment(context: Context, attributeSet: AttributeSet) : MyViewPager
3333

3434
override fun setupFragment(activity: BaseSimpleActivity) {
3535
ensureBackgroundThread {
36+
Track.sorting = context.config.trackSorting
3637
tracks = context.audioHelper.getAllTracks()
3738

3839
val excludedFolders = context.config.excludedFolders
3940
tracks = tracks.filter {
4041
!excludedFolders.contains(it.path.getParentPath())
4142
}.toMutableList() as ArrayList<Track>
4243

43-
Track.sorting = context.config.trackSorting
44-
tracks.sort()
45-
4644
activity.runOnUiThread {
4745
val scanning = activity.mediaScanner.isScanning()
4846
tracks_placeholder.text = if (scanning) {
@@ -104,7 +102,6 @@ class TracksFragment(context: Context, attributeSet: AttributeSet) : MyViewPager
104102
override fun onSortOpen(activity: SimpleActivity) {
105103
ChangeSortingDialog(activity, TAB_TRACKS) {
106104
val adapter = tracks_list.adapter as? TracksAdapter ?: return@ChangeSortingDialog
107-
val tracks = adapter.tracks
108105
Track.sorting = activity.config.trackSorting
109106
tracks.sort()
110107
adapter.updateItems(tracks, forceUpdate = true)

app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/AudioHelper.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ class AudioHelper(private val context: Context) {
2828
val tracks = context.tracksDAO.getAll()
2929
.distinctBy { "${it.path}/${it.mediaStoreId}" } as ArrayList<Track>
3030

31-
Track.sorting = config.trackSorting
3231
tracks.sort()
3332
return tracks
3433
}

app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/Constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ const val PLAYER_SORT_BY_DURATION = 16
117117
const val PLAYER_SORT_BY_ARTIST_TITLE = 32
118118
const val PLAYER_SORT_BY_TRACK_ID = 64
119119
const val PLAYER_SORT_BY_CUSTOM = 128
120+
const val PLAYER_SORT_BY_DATE_ADDED = 256
120121

121122
const val PLAYLIST_SORTING = "playlist_sorting"
122123
const val PLAYLIST_TRACKS_SORTING = "playlist_tracks_sorting"

app/src/main/kotlin/com/simplemobiletools/musicplayer/helpers/RoomHelper.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.simplemobiletools.musicplayer.extensions.config
1111
import com.simplemobiletools.musicplayer.models.Events
1212
import com.simplemobiletools.musicplayer.models.Track
1313
import org.greenrobot.eventbus.EventBus
14+
import java.io.File
1415

1516
class RoomHelper(val context: Context) {
1617
fun insertTracksWithPlaylist(tracks: ArrayList<Track>) {
@@ -66,13 +67,14 @@ class RoomHelper(val context: Context) {
6667
val albumId = cursor.getLongValue(Audio.Media.ALBUM_ID)
6768
val coverArt = ContentUris.withAppendedId(artworkUri, albumId).toString()
6869
val year = cursor.getIntValue(Audio.Media.YEAR)
70+
val dateAdded = cursor.getIntValue(Audio.Media.DATE_ADDED)
6971
val folderName = if (isQPlus()) {
7072
cursor.getStringValue(Audio.Media.BUCKET_DISPLAY_NAME) ?: MediaStore.UNKNOWN_STRING
7173
} else {
7274
""
7375
}
7476

75-
val song = Track(0, mediaStoreId, title, artist, path, duration, album, coverArt, playlistId, 0, folderName, albumId, artistId, year, 0)
77+
val song = Track(0, mediaStoreId, title, artist, path, duration, album, coverArt, playlistId, 0, folderName, albumId, artistId, year, dateAdded, 0)
7678
song.title = song.getProperTitle(showFilename)
7779
songs.add(song)
7880
pathsMap.remove(path)
@@ -83,7 +85,13 @@ class RoomHelper(val context: Context) {
8385
val unknown = MediaStore.UNKNOWN_STRING
8486
val title = context.getTitle(it) ?: unknown
8587
val artist = context.getArtist(it) ?: unknown
86-
val song = Track(0, 0, title, artist, it, context.getDuration(it) ?: 0, "", "", playlistId, 0, "", 0, 0, 0, 0)
88+
val dateAdded = try {
89+
(File(it).lastModified() / 1000L).toInt()
90+
} catch (e: Exception) {
91+
0
92+
}
93+
94+
val song = Track(0, 0, title, artist, it, context.getDuration(it) ?: 0, "", "", playlistId, 0, "", 0, 0, 0,dateAdded ,0)
8795
song.title = song.getProperTitle(showFilename)
8896
songs.add(song)
8997
}

0 commit comments

Comments
 (0)