From 5fa46cc49bc445370dd6612a7ba48de4a1c48576 Mon Sep 17 00:00:00 2001 From: eddyizm Date: Thu, 14 Aug 2025 21:46:33 -0700 Subject: [PATCH] feat:show rating on song view and allow setting/updating. #17 fixed a fr string error --- app/build.gradle | 2 +- .../ui/fragment/PlayerControllerFragment.java | 28 +++++++++++++++++++ .../viewmodel/PlayerBottomSheetViewModel.java | 6 ++-- ...nner_fragment_player_controller_layout.xml | 8 ++---- app/src/main/res/values-fr/strings.xml | 2 +- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ea649294..fbdfbdb7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { targetSdk 35 versionCode 27 - versionName '3.11.2' + versionName '3.11.3' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java index 01d8eb7b..ae5f633b 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerControllerFragment.java @@ -10,6 +10,8 @@ import android.widget.Button; import android.widget.ImageButton; import android.widget.TextView; import android.widget.ToggleButton; +import android.widget.RatingBar; +import android.util.Log; import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; @@ -36,6 +38,7 @@ import com.cappielloantonio.tempo.util.Constants; import com.cappielloantonio.tempo.util.MusicUtil; import com.cappielloantonio.tempo.util.Preferences; import com.cappielloantonio.tempo.viewmodel.PlayerBottomSheetViewModel; +import com.cappielloantonio.tempo.viewmodel.RatingViewModel; import com.google.android.material.chip.Chip; import com.google.android.material.elevation.SurfaceColors; import com.google.common.util.concurrent.ListenableFuture; @@ -53,6 +56,8 @@ public class PlayerControllerFragment extends Fragment { private InnerFragmentPlayerControllerBinding bind; private ViewPager2 playerMediaCoverViewPager; private ToggleButton buttonFavorite; + private RatingViewModel ratingViewModel; + private RatingBar songRatingBar; private TextView playerMediaTitleLabel; private TextView playerArtistNameLabel; private Button playbackSpeedButton; @@ -75,6 +80,7 @@ public class PlayerControllerFragment extends Fragment { View view = bind.getRoot(); playerBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(PlayerBottomSheetViewModel.class); + ratingViewModel = new ViewModelProvider(requireActivity()).get(RatingViewModel.class); init(); initQuickActionView(); @@ -117,6 +123,7 @@ public class PlayerControllerFragment extends Fragment { playerQuickActionView = bind.getRoot().findViewById(R.id.player_quick_action_view); playerOpenQueueButton = bind.getRoot().findViewById(R.id.player_open_queue_button); playerTrackInfo = bind.getRoot().findViewById(R.id.player_info_track); + songRatingBar = bind.getRoot().findViewById(R.id.song_rating_bar); } private void initQuickActionView() { @@ -313,6 +320,7 @@ public class PlayerControllerFragment extends Fragment { private void initMediaListenable() { playerBottomSheetViewModel.getLiveMedia().observe(getViewLifecycleOwner(), media -> { if (media != null) { + ratingViewModel.setSong(media); buttonFavorite.setChecked(media.getStarred() != null); buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite(requireContext(), media)); buttonFavorite.setOnLongClickListener(v -> { @@ -323,9 +331,29 @@ public class PlayerControllerFragment extends Fragment { dialog.setArguments(bundle); dialog.show(requireActivity().getSupportFragmentManager(), null); + return true; }); + Integer currentRating = media.getUserRating(); + + if (currentRating != null) { + songRatingBar.setRating(currentRating); + } else { + songRatingBar.setRating(0); + } + + songRatingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { + @Override + public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { + if (fromUser) { + ratingViewModel.rate((int) rating); + media.setUserRating((int) rating); + } + } + }); + + if (getActivity() != null) { playerBottomSheetViewModel.refreshMediaInfo(requireActivity(), media); } diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlayerBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlayerBottomSheetViewModel.java index 3e712479..339661d8 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlayerBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlayerBottomSheetViewModel.java @@ -2,6 +2,7 @@ package com.cappielloantonio.tempo.viewmodel; import android.app.Application; import android.content.Context; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.OptIn; @@ -32,6 +33,8 @@ import com.cappielloantonio.tempo.util.NetworkUtil; import com.cappielloantonio.tempo.util.OpenSubsonicExtensionsUtil; import com.cappielloantonio.tempo.util.Preferences; +import org.jetbrains.annotations.Nullable; + import java.util.Collections; import java.util.Date; import java.util.List; @@ -103,7 +106,6 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel { favoriteRepository.starLater(media.getId(), null, null, false); } }); - media.setStarred(null); } @@ -131,7 +133,7 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel { } } - public LiveData getLiveLyrics() { + public LiveData getLiveLyrics() { return lyricsLiveData; } diff --git a/app/src/main/res/layout/inner_fragment_player_controller_layout.xml b/app/src/main/res/layout/inner_fragment_player_controller_layout.xml index 024b14d8..b2bbb05e 100644 --- a/app/src/main/res/layout/inner_fragment_player_controller_layout.xml +++ b/app/src/main/res/layout/inner_fragment_player_controller_layout.xml @@ -108,12 +108,10 @@ android:id="@+id/rating_container" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="24dp" android:layout_marginTop="8dp" - android:layout_marginEnd="24dp" android:orientation="horizontal" - android:gravity="center_vertical" - app:layout_constraintEnd_toStartOf="@+id/button_favorite" + android:gravity="center" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/player_artist_name_label"> @@ -134,7 +132,7 @@ android:layout_marginStart="8dp" android:textSize="12sp" android:textColor="?attr/colorOnSurfaceVariant" - android:text="Not rated"/> + android:text=""/> Continuer Continuer et télécharger Le téléchargement des titres favoris pourrer utiliser beaucoup de données. - Synchroniser les titres favorisSync starred tracks + Synchroniser les titres favoris Veuillez redémarrer l\'app pour appliquer les changements. Modifier le chemin de stockage des fichiers mis en cache pourrait provoquer de tous les fichiers mis en cache précédemment. Sélectionner une option de stockage