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