From a130fb38ccede784faccd1936f27fcd6c47c8cc4 Mon Sep 17 00:00:00 2001 From: antonio Date: Tue, 14 Mar 2023 11:55:35 +0100 Subject: [PATCH] Added settings for play queue sync functionality --- .../fragment/PlayerBottomSheetFragment.java | 55 ++++++++++--------- .../play/ui/fragment/PlayerCoverFragment.java | 13 +++++ .../cappielloantonio/play/util/Preferences.kt | 32 ++++++----- .../layout/inner_fragment_player_cover.xml | 15 +++++ .../res/layout/player_header_bottom_sheet.xml | 1 + app/src/main/res/values/arrays.xml | 11 ++++ app/src/main/res/values/strings.xml | 7 ++- app/src/main/res/xml/global_preferences.xml | 21 +++++++ 8 files changed, 115 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerBottomSheetFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerBottomSheetFragment.java index 7950e571..bd193993 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerBottomSheetFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerBottomSheetFragment.java @@ -33,6 +33,7 @@ import com.cappielloantonio.play.subsonic.models.PlayQueue; import com.cappielloantonio.play.ui.fragment.pager.PlayerControllerVerticalPager; import com.cappielloantonio.play.util.Constants; import com.cappielloantonio.play.util.MusicUtil; +import com.cappielloantonio.play.util.Preferences; import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; import com.google.android.material.elevation.SurfaceColors; import com.google.common.util.concurrent.ListenableFuture; @@ -255,38 +256,40 @@ public class PlayerBottomSheetFragment extends Fragment { } private void setHeaderBookmarksButton() { - playerBottomSheetViewModel.getPlayQueue().observeForever(new Observer() { - @Override - public void onChanged(PlayQueue playQueue) { - playerBottomSheetViewModel.getPlayQueue().removeObserver(this); + if (Preferences.isSyncronizationEnabled()) { + playerBottomSheetViewModel.getPlayQueue().observeForever(new Observer() { + @Override + public void onChanged(PlayQueue playQueue) { + playerBottomSheetViewModel.getPlayQueue().removeObserver(this); - if (bind == null) return; + if (bind == null) return; - if (playQueue != null && !playQueue.getEntries().isEmpty()) { - int index = IntStream.range(0, playQueue.getEntries().size()).filter(ix -> playQueue.getEntries().get(ix).getId().equals(playQueue.getCurrent())).findFirst().orElse(-1); + if (playQueue != null && !playQueue.getEntries().isEmpty()) { + int index = IntStream.range(0, playQueue.getEntries().size()).filter(ix -> playQueue.getEntries().get(ix).getId().equals(playQueue.getCurrent())).findFirst().orElse(-1); - if (index != -1) { - bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setVisibility(View.VISIBLE); - bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setOnClickListener(v -> { - MediaManager.startQueue(mediaBrowserListenableFuture, playQueue.getEntries(), index); - bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setVisibility(View.GONE); - }); + if (index != -1) { + bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setVisibility(View.VISIBLE); + bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setOnClickListener(v -> { + MediaManager.startQueue(mediaBrowserListenableFuture, playQueue.getEntries(), index); + bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setVisibility(View.GONE); + }); + } + } else { + bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setVisibility(View.GONE); + bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setOnClickListener(null); } - } else { - bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setVisibility(View.GONE); - bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setOnClickListener(null); } - } - }); + }); - bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setOnLongClickListener(v -> { - bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setVisibility(View.GONE); - return false; - }); - - new Handler().postDelayed(() -> { - if (bind != null) + bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setOnLongClickListener(v -> { bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setVisibility(View.GONE); - }, 5000); + return false; + }); + + new Handler().postDelayed(() -> { + if (bind != null) + bind.playerHeaderLayout.playerHeaderBookmarkMediaButton.setVisibility(View.GONE); + }, Preferences.getSyncCountdownTimer() * 1000L); + } } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerCoverFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerCoverFragment.java index ced493c5..85ac81a0 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerCoverFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerCoverFragment.java @@ -30,6 +30,7 @@ import com.cappielloantonio.play.ui.dialog.PlaylistChooserDialog; import com.cappielloantonio.play.util.Constants; import com.cappielloantonio.play.util.DownloadUtil; import com.cappielloantonio.play.util.MappingUtil; +import com.cappielloantonio.play.util.Preferences; import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; import com.google.android.material.snackbar.Snackbar; import com.google.common.util.concurrent.ListenableFuture; @@ -86,6 +87,9 @@ public class PlayerCoverFragment extends Fragment { TransitionManager.beginDelayedTransition(bind.getRoot(), transition); bind.nowPlayingSongCoverButtonGroup.setVisibility(isVisible ? View.VISIBLE : View.GONE); + + bind.innerButtonBottomRight.setVisibility(Preferences.isSyncronizationEnabled() ? View.VISIBLE : View.GONE); + bind.innerButtonBottomRightAlternative.setVisibility(Preferences.isSyncronizationEnabled() ? View.GONE : View.VISIBLE); } private void initInnerButton() { @@ -119,6 +123,15 @@ public class PlayerCoverFragment extends Fragment { Snackbar.make(requireView(), "Salvato", Snackbar.LENGTH_LONG).show(); } }); + + bind.innerButtonBottomRightAlternative.setOnClickListener(view -> { + if (getActivity() != null) { + PlayerBottomSheetFragment playerBottomSheetFragment = (PlayerBottomSheetFragment) requireActivity().getSupportFragmentManager().findFragmentByTag("PlayerBottomSheet"); + if (playerBottomSheetFragment != null) { + playerBottomSheetFragment.goToLyricsPage(); + } + } + }); } }); } diff --git a/app/src/main/java/com/cappielloantonio/play/util/Preferences.kt b/app/src/main/java/com/cappielloantonio/play/util/Preferences.kt index 5140f457..36d36999 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/Preferences.kt +++ b/app/src/main/java/com/cappielloantonio/play/util/Preferences.kt @@ -1,7 +1,6 @@ package com.cappielloantonio.play.util import com.cappielloantonio.play.App -import com.cappielloantonio.play.helper.ThemeHelper object Preferences { const val THEME = "theme" @@ -24,6 +23,8 @@ object Preferences { private const val DATA_SAVING_MODE = "data_saving_mode" private const val SERVER_UNREACHABLE = "server_unreachable" private const val SYNC_STARRED_TRACKS_FOR_OFFLINE_USE = "sync_starred_tracks_for_offline_use" + private const val QUEUE_SYNCING = "queue_syncing" + private const val QUEUE_SYNCING_COUNTDOWN = "queue_syncing_countdown" @JvmStatic fun getServer(): String? { @@ -112,14 +113,12 @@ object Preferences { @JvmStatic fun setSkipSilenceMode(isSkipSilenceMode: Boolean) { - App.getInstance().preferences.edit().putBoolean(SKIP_SILENCE, isSkipSilenceMode) - .apply() + App.getInstance().preferences.edit().putBoolean(SKIP_SILENCE, isSkipSilenceMode).apply() } @JvmStatic fun getImageCacheSize(): Int { - return App.getInstance().preferences.getString(IMAGE_CACHE_SIZE, "500")!! - .toInt() + return App.getInstance().preferences.getString(IMAGE_CACHE_SIZE, "500")!!.toInt() } @JvmStatic @@ -159,14 +158,13 @@ object Preferences { @JvmStatic fun setDataSavingMode(isDataSavingModeEnabled: Boolean) { - App.getInstance().preferences.edit() - .putBoolean(DATA_SAVING_MODE, isDataSavingModeEnabled).apply() + App.getInstance().preferences.edit().putBoolean(DATA_SAVING_MODE, isDataSavingModeEnabled) + .apply() } @JvmStatic fun isStarredSyncEnabled(): Boolean { - return App.getInstance().preferences - .getBoolean(SYNC_STARRED_TRACKS_FOR_OFFLINE_USE, false) + return App.getInstance().preferences.getBoolean(SYNC_STARRED_TRACKS_FOR_OFFLINE_USE, false) } @JvmStatic @@ -179,14 +177,22 @@ object Preferences { @JvmStatic fun showServerUnreachableDialog(): Boolean { return App.getInstance().preferences.getLong( - SERVER_UNREACHABLE, - 0 + SERVER_UNREACHABLE, 0 ) + 360000 < System.currentTimeMillis() } @JvmStatic fun setServerUnreachableDatetime(datetime: Long) { - App.getInstance().preferences.edit() - .putLong(SERVER_UNREACHABLE, datetime).apply() + App.getInstance().preferences.edit().putLong(SERVER_UNREACHABLE, datetime).apply() + } + + @JvmStatic + fun isSyncronizationEnabled(): Boolean { + return App.getInstance().preferences.getBoolean(QUEUE_SYNCING, false) + } + + @JvmStatic + fun getSyncCountdownTimer(): Int { + return App.getInstance().preferences.getString(QUEUE_SYNCING_COUNTDOWN, "5")!!.toInt() } } \ No newline at end of file diff --git a/app/src/main/res/layout/inner_fragment_player_cover.xml b/app/src/main/res/layout/inner_fragment_player_cover.xml index 4c404b53..b7354d45 100644 --- a/app/src/main/res/layout/inner_fragment_player_cover.xml +++ b/app/src/main/res/layout/inner_fragment_player_cover.xml @@ -102,5 +102,20 @@ app:layout_constraintStart_toEndOf="@+id/vertical_guideline" app:layout_constraintTop_toBottomOf="@+id/horizontal_guideline" /> +