Implemented preference for starred-sync support

This commit is contained in:
CappielloAntonio 2021-09-13 11:28:48 +02:00
parent 147560224f
commit 575c77baf9
11 changed files with 168 additions and 5 deletions

1
.idea/misc.xml generated
View file

@ -51,6 +51,7 @@
<entry key="app/src/main/res/layout/dialog_rating.xml" value="0.3229166666666667" /> <entry key="app/src/main/res/layout/dialog_rating.xml" value="0.3229166666666667" />
<entry key="app/src/main/res/layout/dialog_server_signup.xml" value="0.3229166666666667" /> <entry key="app/src/main/res/layout/dialog_server_signup.xml" value="0.3229166666666667" />
<entry key="app/src/main/res/layout/dialog_server_unreachable.xml" value="0.3537037037037037" /> <entry key="app/src/main/res/layout/dialog_server_unreachable.xml" value="0.3537037037037037" />
<entry key="app/src/main/res/layout/dialog_starred_sync.xml" value="0.528125" />
<entry key="app/src/main/res/layout/fragment_album_catalogue.xml" value="0.3229166666666667" /> <entry key="app/src/main/res/layout/fragment_album_catalogue.xml" value="0.3229166666666667" />
<entry key="app/src/main/res/layout/fragment_album_list_page.xml" value="0.225" /> <entry key="app/src/main/res/layout/fragment_album_list_page.xml" value="0.225" />
<entry key="app/src/main/res/layout/fragment_album_page.xml" value="0.2769409038238702" /> <entry key="app/src/main/res/layout/fragment_album_page.xml" value="0.2769409038238702" />

View file

@ -224,7 +224,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
} }
private void initFavoriteButtonClick() { private void initFavoriteButtonClick() {
bodyBind.buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite()); bodyBind.buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite(requireContext() ));
bodyBind.buttonFavorite.setOnLongClickListener(v -> { bodyBind.buttonFavorite.setOnLongClickListener(v -> {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putParcelable("song_object", playerBottomSheetViewModel.getCurrentSong()); bundle.putParcelable("song_object", playerBottomSheetViewModel.getCurrentSong());

View file

@ -19,6 +19,7 @@ import com.cappielloantonio.play.R;
import com.cappielloantonio.play.helper.ThemeHelper; import com.cappielloantonio.play.helper.ThemeHelper;
import com.cappielloantonio.play.interfaces.ScanCallback; import com.cappielloantonio.play.interfaces.ScanCallback;
import com.cappielloantonio.play.ui.activity.MainActivity; 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.util.PreferenceUtil;
import com.cappielloantonio.play.viewmodel.SettingViewModel; import com.cappielloantonio.play.viewmodel.SettingViewModel;
@ -99,6 +100,16 @@ public class SettingsFragment extends PreferenceFragmentCompat {
someActivityResultLauncher.launch(intent); someActivityResultLauncher.launch(intent);
return true; 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 @Override

View file

@ -75,7 +75,7 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
ToggleButton favoriteToggle = view.findViewById(R.id.button_favorite); ToggleButton favoriteToggle = view.findViewById(R.id.button_favorite);
favoriteToggle.setChecked(songBottomSheetViewModel.getSong().isFavorite()); favoriteToggle.setChecked(songBottomSheetViewModel.getSong().isFavorite());
favoriteToggle.setOnClickListener(v -> { favoriteToggle.setOnClickListener(v -> {
songBottomSheetViewModel.setFavorite(); songBottomSheetViewModel.setFavorite(requireContext());
dismissBottomSheet(); dismissBottomSheet();
}); });
favoriteToggle.setOnLongClickListener(v -> { favoriteToggle.setOnLongClickListener(v -> {

View file

@ -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();
});
}
}

View file

@ -27,6 +27,7 @@ public class PreferenceUtil {
public static final String AUDIO_TRANSCODE_FORMAT_MOBILE = "audio_transcode_format_mobile"; public static final String AUDIO_TRANSCODE_FORMAT_MOBILE = "audio_transcode_format_mobile";
public static final String WIFI_ONLY = "wifi_only"; public static final String WIFI_ONLY = "wifi_only";
public static final String DATA_SAVING_MODE = "data_saving_mode"; 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 static PreferenceUtil sInstance;
private final SharedPreferences mPreferences; private final SharedPreferences mPreferences;
@ -168,4 +169,14 @@ public class PreferenceUtil {
editor.putBoolean(DATA_SAVING_MODE, isDataSavingModeEnabled); editor.putBoolean(DATA_SAVING_MODE, isDataSavingModeEnabled);
editor.apply(); 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();
}
} }

View file

@ -1,6 +1,7 @@
package com.cappielloantonio.play.viewmodel; package com.cappielloantonio.play.viewmodel;
import android.app.Application; import android.app.Application;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel; 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.QueueRepository;
import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.repository.SongRepository;
import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.util.DownloadUtil;
import java.util.Collections;
import java.util.List; import java.util.List;
public class PlayerBottomSheetViewModel extends AndroidViewModel { 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(); Song song = MusicPlayerRemote.getCurrentSong();
if (song != null) { if (song != null) {
@ -50,6 +53,7 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel {
} else { } else {
songRepository.star(song.getId()); songRepository.star(song.getId());
song.setFavorite(true); song.setFavorite(true);
DownloadUtil.getDownloadTracker(context).download(Collections.singletonList(song), null, null);
} }
} }
} }

View file

@ -1,6 +1,7 @@
package com.cappielloantonio.play.viewmodel; package com.cappielloantonio.play.viewmodel;
import android.app.Application; import android.app.Application;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel; 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.AlbumRepository;
import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.ArtistRepository;
import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.repository.SongRepository;
import com.cappielloantonio.play.util.DownloadUtil;
import java.util.Collections;
public class SongBottomSheetViewModel extends AndroidViewModel { public class SongBottomSheetViewModel extends AndroidViewModel {
private final SongRepository songRepository; private final SongRepository songRepository;
@ -36,13 +40,14 @@ public class SongBottomSheetViewModel extends AndroidViewModel {
this.song = song; this.song = song;
} }
public void setFavorite() { public void setFavorite(Context context) {
if (song.isFavorite()) { if (song.isFavorite()) {
songRepository.unstar(song.getId()); songRepository.unstar(song.getId());
song.setFavorite(false); song.setFavorite(false);
} else { } else {
songRepository.star(song.getId()); songRepository.star(song.getId());
song.setFavorite(true); song.setFavorite(true);
DownloadUtil.getDownloadTracker(context).download(Collections.singletonList(song), null, null);
} }
} }

View file

@ -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<List<Song>> starredTracks = new MutableLiveData<>(null);
public StarredSyncViewModel(@NonNull Application application) {
super(application);
songRepository = new SongRepository(application);
}
public LiveData<List<Song>> getStarredTracks(LifecycleOwner owner) {
songRepository.getStarredSongs(false, -1).observe(owner, starredTracks::postValue);
return starredTracks;
}
}

View file

@ -0,0 +1,14 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="24dp"
android:layout_marginBottom="4dp"
android:layout_marginEnd="24dp"
android:text="@string/starred_sync_dialog_summary" />
</LinearLayout>

View file

@ -190,9 +190,13 @@
<string name="connection_alert_dialog_negative_button">Cancel</string> <string name="connection_alert_dialog_negative_button">Cancel</string>
<string name="connection_alert_dialog_summary">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.</string> <string name="connection_alert_dialog_summary">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.</string>
<string name="settings_sync_starred_tracks_for_offline_use_title">Sync starred tracks for offline use</string> <string name="settings_sync_starred_tracks_for_offline_use_title">Sync starred tracks for offline use</string>
<string name="settings_sync_starred_tracks_for_offline_use_summary">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.</string> <string name="settings_sync_starred_tracks_for_offline_use_summary">If enabled, the starred songs will be downloaded for offline use.</string>
<string name="settings_equalizer_title">Equalizer</string> <string name="settings_equalizer_title">Equalizer</string>
<string name="settings_equalizer_summary">Adjust audio settings</string> <string name="settings_equalizer_summary">Adjust audio settings</string>
<string name="settings_scan_title">Scan library</string> <string name="settings_scan_title">Scan library</string>
<string name="settings_logout_title">Log out</string> <string name="settings_logout_title">Log out</string>
<string name="starred_sync_dialog_positive_button">Continue</string>
<string name="starred_sync_dialog_negative_button">Cancel</string>
<string name="starred_sync_dialog_title">Sync starred tracks</string>
<string name="starred_sync_dialog_summary">Tracks will be downloaded in their original format. Standard data rates may apply.</string>
</resources> </resources>