From 575c77baf96dda59a805ea730e37f8f7206b5149 Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Mon, 13 Sep 2021 11:28:48 +0200 Subject: [PATCH] Implemented preference for starred-sync support --- .idea/misc.xml | 1 + .../fragment/PlayerBottomSheetFragment.java | 2 +- .../play/ui/fragment/SettingsFragment.java | 11 +++ .../SongBottomSheetDialog.java | 2 +- .../ui/fragment/dialog/StarredSyncDialog.java | 78 +++++++++++++++++++ .../play/util/PreferenceUtil.java | 11 +++ .../viewmodel/PlayerBottomSheetViewModel.java | 6 +- .../viewmodel/SongBottomSheetViewModel.java | 7 +- .../play/viewmodel/StarredSyncViewModel.java | 35 +++++++++ .../main/res/layout/dialog_starred_sync.xml | 14 ++++ app/src/main/res/values/strings.xml | 6 +- 11 files changed, 168 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/cappielloantonio/play/ui/fragment/dialog/StarredSyncDialog.java create mode 100644 app/src/main/java/com/cappielloantonio/play/viewmodel/StarredSyncViewModel.java create mode 100644 app/src/main/res/layout/dialog_starred_sync.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 8d784b79..4a074a1b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -51,6 +51,7 @@ + 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 d32a5ad0..c4e79b09 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 @@ -224,7 +224,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE } private void initFavoriteButtonClick() { - bodyBind.buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite()); + bodyBind.buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite(requireContext() )); bodyBind.buttonFavorite.setOnLongClickListener(v -> { Bundle bundle = new Bundle(); bundle.putParcelable("song_object", playerBottomSheetViewModel.getCurrentSong()); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SettingsFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SettingsFragment.java index 5c4e258f..ae89cfa4 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SettingsFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SettingsFragment.java @@ -19,6 +19,7 @@ import com.cappielloantonio.play.R; import com.cappielloantonio.play.helper.ThemeHelper; import com.cappielloantonio.play.interfaces.ScanCallback; import com.cappielloantonio.play.ui.activity.MainActivity; +import com.cappielloantonio.play.ui.fragment.dialog.StarredSyncDialog; import com.cappielloantonio.play.util.PreferenceUtil; import com.cappielloantonio.play.viewmodel.SettingViewModel; @@ -99,6 +100,16 @@ public class SettingsFragment extends PreferenceFragmentCompat { someActivityResultLauncher.launch(intent); return true; }); + + findPreference("sync_starred_tracks_for_offline_use").setOnPreferenceChangeListener((preference, newValue) -> { + if (newValue instanceof Boolean) { + if ((Boolean) newValue) { + StarredSyncDialog dialog = new StarredSyncDialog(); + dialog.show(activity.getSupportFragmentManager(), null); + } + } + return true; + }); } @Override diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java index 8129b332..9ca392b2 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java @@ -75,7 +75,7 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements ToggleButton favoriteToggle = view.findViewById(R.id.button_favorite); favoriteToggle.setChecked(songBottomSheetViewModel.getSong().isFavorite()); favoriteToggle.setOnClickListener(v -> { - songBottomSheetViewModel.setFavorite(); + songBottomSheetViewModel.setFavorite(requireContext()); dismissBottomSheet(); }); favoriteToggle.setOnLongClickListener(v -> { diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/dialog/StarredSyncDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/dialog/StarredSyncDialog.java new file mode 100644 index 00000000..a78004e6 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/dialog/StarredSyncDialog.java @@ -0,0 +1,78 @@ +package com.cappielloantonio.play.ui.fragment.dialog; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.cappielloantonio.play.R; +import com.cappielloantonio.play.databinding.DialogConnectionAlertBinding; +import com.cappielloantonio.play.util.DownloadUtil; +import com.cappielloantonio.play.util.PreferenceUtil; +import com.cappielloantonio.play.util.UIUtil; +import com.cappielloantonio.play.viewmodel.HomeViewModel; +import com.cappielloantonio.play.viewmodel.StarredSyncViewModel; + +import java.util.Objects; + +public class StarredSyncDialog extends DialogFragment { + private static final String TAG = "ServerUnreachableDialog"; + + private DialogConnectionAlertBinding bind; + private StarredSyncViewModel starredSyncViewModel; + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + bind = DialogConnectionAlertBinding.inflate(LayoutInflater.from(requireContext())); + starredSyncViewModel = new ViewModelProvider(requireActivity()).get(StarredSyncViewModel.class); + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AppTheme_AlertDialog); + + builder.setView(bind.getRoot()) + .setTitle(R.string.starred_sync_dialog_title) + .setPositiveButton(R.string.starred_sync_dialog_positive_button, (dialog, id) -> { }) + .setNegativeButton(R.string.starred_sync_dialog_negative_button, (dialog, id) -> { }); + + return builder.create(); + } + + @Override + public void onStart() { + super.onStart(); + + setButtonAction(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + bind = null; + } + + private void setButtonAction() { + ((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorAccent, null)); + ((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorAccent, null)); + + ((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> { + starredSyncViewModel.getStarredTracks(requireActivity()).observe(requireActivity(), songs -> { + if (songs != null) { + DownloadUtil.getDownloadTracker(requireContext()).download(songs, null, null); + } + }); + + Objects.requireNonNull(getDialog()).dismiss(); + }); + + ((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> { + PreferenceUtil.getInstance(requireContext()).setStarredSyncEnabled(false); + Objects.requireNonNull(getDialog()).dismiss(); + }); + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/util/PreferenceUtil.java b/app/src/main/java/com/cappielloantonio/play/util/PreferenceUtil.java index 75f92c5f..7171ed1f 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/PreferenceUtil.java +++ b/app/src/main/java/com/cappielloantonio/play/util/PreferenceUtil.java @@ -27,6 +27,7 @@ public class PreferenceUtil { public static final String AUDIO_TRANSCODE_FORMAT_MOBILE = "audio_transcode_format_mobile"; public static final String WIFI_ONLY = "wifi_only"; public static final String DATA_SAVING_MODE = "data_saving_mode"; + public static final String SYNC_STARRED_TRACKS_FOR_OFFLINE_USE = "sync_starred_tracks_for_offline_use"; private static PreferenceUtil sInstance; private final SharedPreferences mPreferences; @@ -168,4 +169,14 @@ public class PreferenceUtil { editor.putBoolean(DATA_SAVING_MODE, isDataSavingModeEnabled); editor.apply(); } + + public final boolean isStarredSyncEnabled() { + return mPreferences.getBoolean(SYNC_STARRED_TRACKS_FOR_OFFLINE_USE, false); + } + + public void setStarredSyncEnabled(Boolean isStarredSyncEnabled) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean(SYNC_STARRED_TRACKS_FOR_OFFLINE_USE, isStarredSyncEnabled); + editor.apply(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlayerBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlayerBottomSheetViewModel.java index a4fb344c..84cfbaa6 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlayerBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlayerBottomSheetViewModel.java @@ -1,6 +1,7 @@ package com.cappielloantonio.play.viewmodel; import android.app.Application; +import android.content.Context; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; @@ -11,7 +12,9 @@ import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.service.MusicPlayerRemote; +import com.cappielloantonio.play.util.DownloadUtil; +import java.util.Collections; import java.util.List; public class PlayerBottomSheetViewModel extends AndroidViewModel { @@ -40,7 +43,7 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel { } - public void setFavorite() { + public void setFavorite(Context context) { Song song = MusicPlayerRemote.getCurrentSong(); if (song != null) { @@ -50,6 +53,7 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel { } else { songRepository.star(song.getId()); song.setFavorite(true); + DownloadUtil.getDownloadTracker(context).download(Collections.singletonList(song), null, null); } } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java index 9e7ee2b3..a41aab24 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java @@ -1,6 +1,7 @@ package com.cappielloantonio.play.viewmodel; import android.app.Application; +import android.content.Context; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; @@ -12,6 +13,9 @@ import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.AlbumRepository; import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.SongRepository; +import com.cappielloantonio.play.util.DownloadUtil; + +import java.util.Collections; public class SongBottomSheetViewModel extends AndroidViewModel { private final SongRepository songRepository; @@ -36,13 +40,14 @@ public class SongBottomSheetViewModel extends AndroidViewModel { this.song = song; } - public void setFavorite() { + public void setFavorite(Context context) { if (song.isFavorite()) { songRepository.unstar(song.getId()); song.setFavorite(false); } else { songRepository.star(song.getId()); song.setFavorite(true); + DownloadUtil.getDownloadTracker(context).download(Collections.singletonList(song), null, null); } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/StarredSyncViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/StarredSyncViewModel.java new file mode 100644 index 00000000..b213546a --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/StarredSyncViewModel.java @@ -0,0 +1,35 @@ +package com.cappielloantonio.play.viewmodel; + +import android.app.Application; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +import com.cappielloantonio.play.model.Playlist; +import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.repository.PlaylistRepository; +import com.cappielloantonio.play.repository.SongRepository; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class StarredSyncViewModel extends AndroidViewModel { + private final SongRepository songRepository; + + private final MutableLiveData> starredTracks = new MutableLiveData<>(null); + + public StarredSyncViewModel(@NonNull Application application) { + super(application); + + songRepository = new SongRepository(application); + } + + public LiveData> getStarredTracks(LifecycleOwner owner) { + songRepository.getStarredSongs(false, -1).observe(owner, starredTracks::postValue); + return starredTracks; + } +} diff --git a/app/src/main/res/layout/dialog_starred_sync.xml b/app/src/main/res/layout/dialog_starred_sync.xml new file mode 100644 index 00000000..c2c89fa3 --- /dev/null +++ b/app/src/main/res/layout/dialog_starred_sync.xml @@ -0,0 +1,14 @@ + + + + \ 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 1f63ceab..773bd700 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -190,9 +190,13 @@ Cancel Access to the Subsonic server on connections other than WiFi has been restricted. To prevent this alert dialod from reappearing, disable the connection check in the app settings. Sync starred tracks for offline use - If enabled, the starred songs will be downloaded for offline use. Attention: the songs will be downloaded in their original format. Standard data rates may apply. + If enabled, the starred songs will be downloaded for offline use. Equalizer Adjust audio settings Scan library Log out + Continue + Cancel + Sync starred tracks + Tracks will be downloaded in their original format. Standard data rates may apply. \ No newline at end of file