From 9b59c5299a55a237cb56cf0fb7259c18d43e4e6f Mon Sep 17 00:00:00 2001 From: Omar Date: Sun, 6 Mar 2022 17:58:10 +0200 Subject: [PATCH 1/3] Added option to disable history and undo clear history + UX improvements (History Tab) --- .../code/name/monkey/retromusic/Constants.kt | 3 +- .../base/AbsMusicServiceActivity.kt | 6 +- .../retromusic/fragments/LibraryViewModel.kt | 17 ++++++ .../fragments/other/DetailListFragment.kt | 58 +++++++++++++++---- .../monkey/retromusic/util/PreferenceUtil.kt | 6 ++ .../res/layout/fragment_playlist_detail.xml | 10 ++++ app/src/main/res/values/strings.xml | 6 ++ app/src/main/res/xml/pref_ui.xml | 7 +++ 8 files changed, 100 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.kt b/app/src/main/java/code/name/monkey/retromusic/Constants.kt index 13574349a..a7a84ba34 100644 --- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt +++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt @@ -163,4 +163,5 @@ const val APPBAR_MODE = "appbar_mode" 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" \ No newline at end of file +const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing" +const val KEEP_HISTORY = "keep_history" \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt index 4c70a87bd..3dc4c16b1 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt @@ -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()) { 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 b462da4aa..db9c958d3 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 @@ -50,6 +50,7 @@ class LibraryViewModel( private val searchResults = MutableLiveData>() private val fabMargin = MutableLiveData(0) private val songHistory = MutableLiveData>() + private var previousSongHistory = ArrayList() val paletteColor: LiveData = _paletteColor init { @@ -342,11 +343,27 @@ class LibraryViewModel( fun clearHistory() { viewModelScope.launch(IO) { + previousSongHistory = repository.historySong() as ArrayList + repository.clearSongHistory() } songHistory.value = emptyList() } + + fun restoreHistory() { + viewModelScope.launch(IO) { + if (previousSongHistory.isNotEmpty()) { + val history = ArrayList() + for (song in previousSongHistory) { + repository.addSongToHistory(song.toSong()) + history.add(song.toSong()) + } + songHistory.postValue(history) + } + } + } + fun favorites() = repository.favorites() fun clearSearchResult() { 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 70cf65df7..0449f4e3b 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 @@ -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() @@ -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 } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt index 990f611e9..0065bf9bc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt @@ -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) diff --git a/app/src/main/res/layout/fragment_playlist_detail.xml b/app/src/main/res/layout/fragment_playlist_detail.xml index ffaf5985d..1db0f7c8e 100644 --- a/app/src/main/res/layout/fragment_playlist_detail.xml +++ b/app/src/main/res/layout/fragment_playlist_detail.xml @@ -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" /> + +