diff --git a/app/src/main/java/code/name/monkey/retromusic/db/HistoryDao.kt b/app/src/main/java/code/name/monkey/retromusic/db/HistoryDao.kt index d8c6578d1..c8b2e3165 100644 --- a/app/src/main/java/code/name/monkey/retromusic/db/HistoryDao.kt +++ b/app/src/main/java/code/name/monkey/retromusic/db/HistoryDao.kt @@ -39,4 +39,7 @@ interface HistoryDao { @Query("SELECT * FROM HistoryEntity ORDER BY time_played DESC LIMIT $HISTORY_LIMIT") fun observableHistorySongs(): LiveData> + + @Query("DELETE FROM HistoryEntity") + suspend fun clearHistory() } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt index be3904175..b462da4aa 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt @@ -49,6 +49,7 @@ class LibraryViewModel( private val genres = MutableLiveData>() private val searchResults = MutableLiveData>() private val fabMargin = MutableLiveData(0) + private val songHistory = MutableLiveData>() val paletteColor: LiveData = _paletteColor init { @@ -320,20 +321,30 @@ class LibraryViewModel( emit(repository.contributor()) } - fun observableHistorySongs(): LiveData> = liveData { + fun observableHistorySongs(): LiveData> { val songs = repository.historySong().map { it.toSong() } - emit(songs) + songHistory.value = songs // Cleaning up deleted or moved songs - songs.forEach { song -> - if (!File(song.data).exists() || song.id == -1L) { - repository.deleteSongInHistory(song.id) + viewModelScope.launch { + songs.forEach { song -> + if (!File(song.data).exists() || song.id == -1L) { + repository.deleteSongInHistory(song.id) + } } } - emit(repository.historySong().map { + songHistory.value = repository.historySong().map { it.toSong() - }) + } + return songHistory + } + + fun clearHistory() { + viewModelScope.launch(IO) { + repository.clearSongHistory() + } + songHistory.value = emptyList() } fun favorites() = repository.favorites() diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt index 9b28980ac..70cf65df7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt @@ -15,6 +15,9 @@ package code.name.monkey.retromusic.fragments.other import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem import android.view.View import androidx.activity.addCallback import androidx.core.os.bundleOf @@ -55,6 +58,12 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de private val args by navArgs() private var _binding: FragmentPlaylistDetailBinding? = null private val binding get() = _binding!! + private var showClearHistoryOption = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setHasOptionsMenu(true) + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -81,7 +90,10 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de TOP_ALBUMS -> loadAlbums(R.string.top_albums, TOP_ALBUMS) RECENT_ALBUMS -> loadAlbums(R.string.recent_albums, RECENT_ALBUMS) FAVOURITES -> loadFavorite() - HISTORY_PLAYLIST -> loadHistory() + HISTORY_PLAYLIST -> { + loadHistory() + showClearHistoryOption = true // Reference to onCreateOptionsMenu + } LAST_ADDED_PLAYLIST -> lastAddedSongs() TOP_PLAYED_PLAYLIST -> topPlayed() } @@ -281,4 +293,24 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de } return cab as AttachedCab } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + inflater.inflate(R.menu.menu_clear_history, menu) + if (showClearHistoryOption) { + menu.findItem(R.id.action_clear_history).isVisible = true // Show Clear History option + } + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + + when (item.itemId) { + R.id.action_clear_history -> libraryViewModel.clearHistory() + /* + TODO("Show a snackbar showing that history has been successfully + cleared and that will have an undo button") + */ + } + return false + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt index 71d79ef6a..9ab706a7f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt @@ -100,6 +100,7 @@ interface Repository { suspend fun updateSongInPlayCount(playCountEntity: PlayCountEntity) suspend fun deleteSongInPlayCount(playCountEntity: PlayCountEntity) suspend fun deleteSongInHistory(songId: Long) + suspend fun clearSongHistory() suspend fun checkSongExistInPlayCount(songId: Long): List suspend fun playCountSongs(): List suspend fun blackListPaths(): List @@ -330,6 +331,10 @@ class RealRepository( override suspend fun deleteSongInHistory(songId: Long) = roomRepository.deleteSongInHistory(songId) + override suspend fun clearSongHistory() { + roomRepository.clearSongHistory() + } + override suspend fun checkSongExistInPlayCount(songId: Long): List = roomRepository.checkSongExistInPlayCount(songId) diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt index d2b8ec619..ab1fa058b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt @@ -39,6 +39,7 @@ interface RoomRepository { suspend fun updateSongInPlayCount(playCountEntity: PlayCountEntity) suspend fun deleteSongInPlayCount(playCountEntity: PlayCountEntity) suspend fun deleteSongInHistory(songId: Long) + suspend fun clearSongHistory() suspend fun checkSongExistInPlayCount(songId: Long): List suspend fun playCountSongs(): List suspend fun insertBlacklistPath(blackListStoreEntities: List) @@ -170,6 +171,10 @@ class RealRoomRepository( historyDao.deleteSongInHistory(songId) } + override suspend fun clearSongHistory() { + historyDao.clearHistory() + } + override suspend fun checkSongExistInPlayCount(songId: Long): List = playCountDao.checkSongExistInPlayCount(songId) diff --git a/app/src/main/res/menu/menu_clear_history.xml b/app/src/main/res/menu/menu_clear_history.xml new file mode 100644 index 000000000..5563e2d95 --- /dev/null +++ b/app/src/main/res/menu/menu_clear_history.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5e6ee71e1..6a9224574 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -206,6 +206,7 @@ Need more help? Hinge History + Clear History Home Horizontal flip Image