Added option to disable history and undo clear history + UX improvements (History Tab)
This commit is contained in:
parent
0e9392b6c5
commit
9b59c5299a
8 changed files with 100 additions and 13 deletions
|
@ -164,3 +164,4 @@ const val WALLPAPER_ACCENT = "wallpaper_accent"
|
||||||
const val SCREEN_ON_LYRICS = "screen_on_lyrics"
|
const val SCREEN_ON_LYRICS = "screen_on_lyrics"
|
||||||
const val CIRCLE_PLAY_BUTTON = "circle_play_button"
|
const val CIRCLE_PLAY_BUTTON = "circle_play_button"
|
||||||
const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing"
|
const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing"
|
||||||
|
const val KEEP_HISTORY = "keep_history"
|
|
@ -31,6 +31,7 @@ import code.name.monkey.retromusic.service.MusicService.Companion.PLAY_STATE_CHA
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.QUEUE_CHANGED
|
import code.name.monkey.retromusic.service.MusicService.Companion.QUEUE_CHANGED
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.REPEAT_MODE_CHANGED
|
import code.name.monkey.retromusic.service.MusicService.Companion.REPEAT_MODE_CHANGED
|
||||||
import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_CHANGED
|
import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_CHANGED
|
||||||
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
|
@ -123,7 +124,10 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi
|
||||||
if (entity != null) {
|
if (entity != null) {
|
||||||
repository.updateHistorySong(MusicPlayerRemote.currentSong)
|
repository.updateHistorySong(MusicPlayerRemote.currentSong)
|
||||||
} else {
|
} else {
|
||||||
repository.addSongToHistory(MusicPlayerRemote.currentSong)
|
// Check whether keep history option is ON or OFF
|
||||||
|
if (PreferenceUtil.homeHistory) {
|
||||||
|
repository.addSongToHistory(MusicPlayerRemote.currentSong)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
val songs = repository.checkSongExistInPlayCount(MusicPlayerRemote.currentSong.id)
|
val songs = repository.checkSongExistInPlayCount(MusicPlayerRemote.currentSong.id)
|
||||||
if (songs.isNotEmpty()) {
|
if (songs.isNotEmpty()) {
|
||||||
|
|
|
@ -50,6 +50,7 @@ class LibraryViewModel(
|
||||||
private val searchResults = MutableLiveData<List<Any>>()
|
private val searchResults = MutableLiveData<List<Any>>()
|
||||||
private val fabMargin = MutableLiveData(0)
|
private val fabMargin = MutableLiveData(0)
|
||||||
private val songHistory = MutableLiveData<List<Song>>()
|
private val songHistory = MutableLiveData<List<Song>>()
|
||||||
|
private var previousSongHistory = ArrayList<HistoryEntity>()
|
||||||
val paletteColor: LiveData<Int> = _paletteColor
|
val paletteColor: LiveData<Int> = _paletteColor
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -342,11 +343,27 @@ class LibraryViewModel(
|
||||||
|
|
||||||
fun clearHistory() {
|
fun clearHistory() {
|
||||||
viewModelScope.launch(IO) {
|
viewModelScope.launch(IO) {
|
||||||
|
previousSongHistory = repository.historySong() as ArrayList<HistoryEntity>
|
||||||
|
|
||||||
repository.clearSongHistory()
|
repository.clearSongHistory()
|
||||||
}
|
}
|
||||||
songHistory.value = emptyList()
|
songHistory.value = emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun restoreHistory() {
|
||||||
|
viewModelScope.launch(IO) {
|
||||||
|
if (previousSongHistory.isNotEmpty()) {
|
||||||
|
val history = ArrayList<Song>()
|
||||||
|
for (song in previousSongHistory) {
|
||||||
|
repository.addSongToHistory(song.toSong())
|
||||||
|
history.add(song.toSong())
|
||||||
|
}
|
||||||
|
songHistory.postValue(history)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun favorites() = repository.favorites()
|
fun favorites() = repository.favorites()
|
||||||
|
|
||||||
fun clearSearchResult() {
|
fun clearSearchResult() {
|
||||||
|
|
|
@ -14,14 +14,13 @@
|
||||||
*/
|
*/
|
||||||
package code.name.monkey.retromusic.fragments.other
|
package code.name.monkey.retromusic.fragments.other
|
||||||
|
|
||||||
|
import android.graphics.Color
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.Menu
|
import android.view.*
|
||||||
import android.view.MenuInflater
|
|
||||||
import android.view.MenuItem
|
|
||||||
import android.view.View
|
|
||||||
import androidx.activity.addCallback
|
import androidx.activity.addCallback
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.view.doOnPreDraw
|
import androidx.core.view.doOnPreDraw
|
||||||
|
import androidx.core.view.isVisible
|
||||||
import androidx.navigation.fragment.FragmentNavigatorExtras
|
import androidx.navigation.fragment.FragmentNavigatorExtras
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
|
@ -44,6 +43,7 @@ import code.name.monkey.retromusic.interfaces.ICabCallback
|
||||||
import code.name.monkey.retromusic.interfaces.ICabHolder
|
import code.name.monkey.retromusic.interfaces.ICabHolder
|
||||||
import code.name.monkey.retromusic.model.Album
|
import code.name.monkey.retromusic.model.Album
|
||||||
import code.name.monkey.retromusic.model.Artist
|
import code.name.monkey.retromusic.model.Artist
|
||||||
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil
|
import code.name.monkey.retromusic.util.RetroColorUtil
|
||||||
import code.name.monkey.retromusic.util.RetroUtil
|
import code.name.monkey.retromusic.util.RetroUtil
|
||||||
import com.afollestad.materialcab.attached.AttachedCab
|
import com.afollestad.materialcab.attached.AttachedCab
|
||||||
|
@ -51,8 +51,10 @@ import com.afollestad.materialcab.attached.destroy
|
||||||
import com.afollestad.materialcab.attached.isActive
|
import com.afollestad.materialcab.attached.isActive
|
||||||
import com.afollestad.materialcab.createCab
|
import com.afollestad.materialcab.createCab
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable
|
import com.google.android.material.shape.MaterialShapeDrawable
|
||||||
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.google.android.material.transition.MaterialSharedAxis
|
import com.google.android.material.transition.MaterialSharedAxis
|
||||||
|
|
||||||
|
|
||||||
class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
|
class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
|
||||||
IArtistClickListener, IAlbumClickListener, ICabHolder {
|
IArtistClickListener, IAlbumClickListener, ICabHolder {
|
||||||
private val args by navArgs<DetailListFragmentArgs>()
|
private val args by navArgs<DetailListFragmentArgs>()
|
||||||
|
@ -162,8 +164,23 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
adapter = songAdapter
|
adapter = songAdapter
|
||||||
layoutManager = linearLayoutManager()
|
layoutManager = linearLayoutManager()
|
||||||
}
|
}
|
||||||
libraryViewModel.observableHistorySongs().observe(viewLifecycleOwner) {
|
if (PreferenceUtil.homeHistory) { // Observe only if keep history is enabled
|
||||||
songAdapter.swapDataSet(it)
|
libraryViewModel.observableHistorySongs().observe(viewLifecycleOwner) {
|
||||||
|
songAdapter.swapDataSet(it)
|
||||||
|
binding.empty.isVisible = it.isEmpty()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
historyDisabled() // Update Ui
|
||||||
|
binding.emptyButton.setOnClickListener {
|
||||||
|
findNavController().navigate(
|
||||||
|
R.id.settingsActivity,
|
||||||
|
null,
|
||||||
|
navOptions
|
||||||
|
)
|
||||||
|
findNavController().popBackStack()
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,6 +253,12 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
return if (RetroUtil.isLandscape()) 4 else 2
|
return if (RetroUtil.isLandscape()) 4 else 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun historyDisabled() {
|
||||||
|
binding.empty.isVisible = true
|
||||||
|
binding.emptyText.text = getString(R.string.history_disabled)
|
||||||
|
binding.emptyButton.isVisible = true
|
||||||
|
}
|
||||||
|
|
||||||
override fun onArtist(artistId: Long, view: View) {
|
override fun onArtist(artistId: Long, view: View) {
|
||||||
findNavController().navigate(
|
findNavController().navigate(
|
||||||
R.id.artistDetailsFragment,
|
R.id.artistDetailsFragment,
|
||||||
|
@ -305,11 +328,24 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.action_clear_history -> libraryViewModel.clearHistory()
|
R.id.action_clear_history -> {
|
||||||
/*
|
if (binding.recyclerView.adapter?.itemCount!! > 0) {
|
||||||
TODO("Show a snackbar showing that history has been successfully
|
libraryViewModel.clearHistory()
|
||||||
cleared and that will have an undo button")
|
|
||||||
*/
|
val snackBar =
|
||||||
|
Snackbar.make(binding.container,
|
||||||
|
getString(R.string.history_cleared),
|
||||||
|
Snackbar.LENGTH_LONG)
|
||||||
|
.setAction(getString(R.string.history_undo_button)) {
|
||||||
|
libraryViewModel.restoreHistory()
|
||||||
|
}
|
||||||
|
.setActionTextColor(Color.YELLOW)
|
||||||
|
val snackBarView = snackBar.view
|
||||||
|
snackBarView.translationY =
|
||||||
|
-(resources.getDimension(R.dimen.mini_player_height))
|
||||||
|
snackBar.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -637,6 +637,12 @@ object PreferenceUtil {
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val homeHistory: Boolean
|
||||||
|
get() = sharedPreferences.getBoolean(
|
||||||
|
KEEP_HISTORY,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
|
||||||
var audioFadeDuration
|
var audioFadeDuration
|
||||||
get() = sharedPreferences
|
get() = sharedPreferences
|
||||||
.getInt(AUDIO_FADE_DURATION, 0)
|
.getInt(AUDIO_FADE_DURATION, 0)
|
||||||
|
|
|
@ -62,11 +62,21 @@
|
||||||
android:id="@+id/emptyText"
|
android:id="@+id/emptyText"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:text="@string/no_songs"
|
android:text="@string/no_songs"
|
||||||
android:textAppearance="@style/TextViewHeadline5"
|
android:textAppearance="@style/TextViewHeadline5"
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/emptyButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:text="@string/settings_button"
|
||||||
|
android:background="@drawable/widget_button_background"
|
||||||
|
android:visibility="invisible"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<com.google.android.material.progressindicator.CircularProgressIndicator
|
<com.google.android.material.progressindicator.CircularProgressIndicator
|
||||||
|
|
|
@ -262,6 +262,8 @@
|
||||||
<string name="no_purchase_found">No purchase found.</string>
|
<string name="no_purchase_found">No purchase found.</string>
|
||||||
<string name="no_results">No results</string>
|
<string name="no_results">No results</string>
|
||||||
<string name="no_songs">You have no songs</string>
|
<string name="no_songs">You have no songs</string>
|
||||||
|
<string name="history_disabled">You have disabled history.</string>
|
||||||
|
<string name="settings_button">Settings</string>
|
||||||
<string name="normal">Normal</string>
|
<string name="normal">Normal</string>
|
||||||
<string name="normal_lyrics">Normal lyrics</string>
|
<string name="normal_lyrics">Normal lyrics</string>
|
||||||
<string name="not_listed_in_media_store">
|
<string name="not_listed_in_media_store">
|
||||||
|
@ -356,6 +358,7 @@
|
||||||
<string name="pref_summary_toggle_volume">If enough space is available, show volume controls in the now playing screen</string>
|
<string name="pref_summary_toggle_volume">If enough space is available, show volume controls in the now playing screen</string>
|
||||||
<string name="pref_summary_wallpaper_accent">Extract accent color from wallpaper</string>
|
<string name="pref_summary_wallpaper_accent">Extract accent color from wallpaper</string>
|
||||||
<string name="pref_summary_whitelist">Only show music from /Music Folder</string>
|
<string name="pref_summary_whitelist">Only show music from /Music Folder</string>
|
||||||
|
<string name="pref_summary_keep_history">Keeps a history of played songs</string>
|
||||||
<string name="pref_title_album_art_on_lockscreen">Show album cover</string>
|
<string name="pref_title_album_art_on_lockscreen">Show album cover</string>
|
||||||
<string name="pref_title_album_artists_only">Navigate by Album Artist</string>
|
<string name="pref_title_album_artists_only">Navigate by Album Artist</string>
|
||||||
<string name="pref_title_album_cover_style">Album cover theme</string>
|
<string name="pref_title_album_cover_style">Album cover theme</string>
|
||||||
|
@ -402,6 +405,7 @@
|
||||||
<string name="pref_title_toggle_volume">Volume controls</string>
|
<string name="pref_title_toggle_volume">Volume controls</string>
|
||||||
<string name="pref_title_wallpaper_accent">Wallpaper accent color</string>
|
<string name="pref_title_wallpaper_accent">Wallpaper accent color</string>
|
||||||
<string name="pref_title_whitelist">Whitelist music</string>
|
<string name="pref_title_whitelist">Whitelist music</string>
|
||||||
|
<string name="pref_title_keep_history">Keep history</string>
|
||||||
<string name="pro">Pro</string>
|
<string name="pro">Pro</string>
|
||||||
<string name="pro_summary">Black theme, Now playing themes, Carousel effect and more..</string>
|
<string name="pro_summary">Black theme, Now playing themes, Carousel effect and more..</string>
|
||||||
<string name="profile">Profile</string>
|
<string name="profile">Profile</string>
|
||||||
|
@ -544,4 +548,6 @@
|
||||||
<string name="you_will_be_forwarded_to_the_issue_tracker_website">You will be forwarded to the issue tracker website.</string>
|
<string name="you_will_be_forwarded_to_the_issue_tracker_website">You will be forwarded to the issue tracker website.</string>
|
||||||
<string name="your_account_data_is_only_used_for_authentication">Your account data is only used for authentication.</string>
|
<string name="your_account_data_is_only_used_for_authentication">Your account data is only used for authentication.</string>
|
||||||
<string name="customactivityoncrash_error_activity_error_details_share">Share Crash Report</string>
|
<string name="customactivityoncrash_error_activity_error_details_share">Share Crash Report</string>
|
||||||
|
<string name="history_cleared">History cleared</string>
|
||||||
|
<string name="history_undo_button">Undo</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -40,6 +40,13 @@
|
||||||
android:summary="@string/pref_summary_suggestions"
|
android:summary="@string/pref_summary_suggestions"
|
||||||
android:title="@string/pref_title_suggestions" />
|
android:title="@string/pref_title_suggestions" />
|
||||||
|
|
||||||
|
<code.name.monkey.appthemehelper.common.prefs.supportv7.ATESwitchPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="keep_history"
|
||||||
|
android:layout="@layout/list_item_view_switch"
|
||||||
|
android:summary="@string/pref_summary_keep_history"
|
||||||
|
android:title="@string/pref_title_keep_history" />
|
||||||
|
|
||||||
</code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceCategory>
|
</code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceCategory>
|
||||||
|
|
||||||
<code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceCategory
|
<code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceCategory
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue