Added option to disable history and undo clear history + UX improvements (History Tab)

This commit is contained in:
Omar 2022-03-06 17:58:10 +02:00
parent 0e9392b6c5
commit 9b59c5299a
8 changed files with 100 additions and 13 deletions

View file

@ -164,3 +164,4 @@ const val WALLPAPER_ACCENT = "wallpaper_accent"
const val SCREEN_ON_LYRICS = "screen_on_lyrics"
const val CIRCLE_PLAY_BUTTON = "circle_play_button"
const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing"
const val KEEP_HISTORY = "keep_history"

View file

@ -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.REPEAT_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.launch
import org.koin.android.ext.android.inject
@ -123,7 +124,10 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi
if (entity != null) {
repository.updateHistorySong(MusicPlayerRemote.currentSong)
} 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)
if (songs.isNotEmpty()) {

View file

@ -50,6 +50,7 @@ class LibraryViewModel(
private val searchResults = MutableLiveData<List<Any>>()
private val fabMargin = MutableLiveData(0)
private val songHistory = MutableLiveData<List<Song>>()
private var previousSongHistory = ArrayList<HistoryEntity>()
val paletteColor: LiveData<Int> = _paletteColor
init {
@ -342,11 +343,27 @@ class LibraryViewModel(
fun clearHistory() {
viewModelScope.launch(IO) {
previousSongHistory = repository.historySong() as ArrayList<HistoryEntity>
repository.clearSongHistory()
}
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 clearSearchResult() {

View file

@ -14,14 +14,13 @@
*/
package code.name.monkey.retromusic.fragments.other
import android.graphics.Color
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.*
import androidx.activity.addCallback
import androidx.core.os.bundleOf
import androidx.core.view.doOnPreDraw
import androidx.core.view.isVisible
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
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.model.Album
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.RetroUtil
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.createCab
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.transition.MaterialSharedAxis
class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
IArtistClickListener, IAlbumClickListener, ICabHolder {
private val args by navArgs<DetailListFragmentArgs>()
@ -162,8 +164,23 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
adapter = songAdapter
layoutManager = linearLayoutManager()
}
libraryViewModel.observableHistorySongs().observe(viewLifecycleOwner) {
songAdapter.swapDataSet(it)
if (PreferenceUtil.homeHistory) { // Observe only if keep history is enabled
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
}
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) {
findNavController().navigate(
R.id.artistDetailsFragment,
@ -305,11 +328,24 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
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")
*/
R.id.action_clear_history -> {
if (binding.recyclerView.adapter?.itemCount!! > 0) {
libraryViewModel.clearHistory()
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
}

View file

@ -637,6 +637,12 @@ object PreferenceUtil {
true
)
val homeHistory: Boolean
get() = sharedPreferences.getBoolean(
KEEP_HISTORY,
true
)
var audioFadeDuration
get() = sharedPreferences
.getInt(AUDIO_FADE_DURATION, 0)

View file

@ -62,11 +62,21 @@
android:id="@+id/emptyText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_gravity="center"
android:text="@string/no_songs"
android:textAppearance="@style/TextViewHeadline5"
android:textColor="?android:attr/textColorSecondary"
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>
<com.google.android.material.progressindicator.CircularProgressIndicator

View file

@ -262,6 +262,8 @@
<string name="no_purchase_found">No purchase found.</string>
<string name="no_results">No results</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_lyrics">Normal lyrics</string>
<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_wallpaper_accent">Extract accent color from wallpaper</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_artists_only">Navigate by Album Artist</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_wallpaper_accent">Wallpaper accent color</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_summary">Black theme, Now playing themes, Carousel effect and more..</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="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="history_cleared">History cleared</string>
<string name="history_undo_button">Undo</string>
</resources>

View file

@ -40,6 +40,13 @@
android:summary="@string/pref_summary_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