feat: as an option show the item's rating and whether it is marked as a favorite

This commit is contained in:
CappielloAntonio 2024-03-24 00:45:19 +01:00
parent 4b9eaa8c3d
commit 58d540b939
12 changed files with 70 additions and 14 deletions

View file

@ -17,6 +17,7 @@ import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.util.Constants; import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.DownloadUtil; import com.cappielloantonio.tempo.util.DownloadUtil;
import com.cappielloantonio.tempo.util.MusicUtil; import com.cappielloantonio.tempo.util.MusicUtil;
import com.cappielloantonio.tempo.util.Preferences;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -59,11 +60,13 @@ public class SongHorizontalAdapter extends RecyclerView.Adapter<SongHorizontalAd
song.getArtist() song.getArtist()
), ),
MusicUtil.getReadableDurationString(song.getDuration(), false), MusicUtil.getReadableDurationString(song.getDuration(), false),
MusicUtil.getReadableAudioQualityString(song) MusicUtil.getReadableAudioQualityString(song),
MusicUtil.getRatingNumber(song.getUserRating())
) )
); );
holder.item.trackNumberTextView.setText(MusicUtil.getReadableTrackNumber(holder.itemView.getContext(), song.getTrack())); holder.item.trackNumberTextView.setText(MusicUtil.getReadableTrackNumber(holder.itemView.getContext(), song.getTrack()));
if (Preferences.showItemRating()) holder.item.preferredIcon.setVisibility(song.getStarred() != null ? View.VISIBLE : View.GONE);
if (DownloadUtil.getDownloadTracker(holder.itemView.getContext()).isDownloaded(song.getId())) { if (DownloadUtil.getDownloadTracker(holder.itemView.getContext()).isDownloaded(song.getId())) {
holder.item.searchResultDownloadIndicatorImageView.setVisibility(View.VISIBLE); holder.item.searchResultDownloadIndicatorImageView.setVisibility(View.VISIBLE);

View file

@ -195,6 +195,21 @@ public class MusicUtil {
return context.getString(R.string.label_placeholder); return context.getString(R.string.label_placeholder);
} }
public static String getRatingNumber(Integer ratingNumber) {
if (ratingNumber == null || !Preferences.showItemRating()) return "";
StringBuilder builder = new StringBuilder();
builder.append("");
builder.append(" ");
for (int i = 0; i < ratingNumber; i++) {
builder.append("");
}
return builder.toString();
}
public static String forceReadableString(String string) { public static String forceReadableString(String string) {
if (string != null) { if (string != null) {
return getReadableString(string) return getReadableString(string)

View file

@ -56,6 +56,7 @@ object Preferences {
private const val ALWAYS_ON_DISPLAY = "always_on_display" private const val ALWAYS_ON_DISPLAY = "always_on_display"
private const val AUDIO_QUALITY_PER_ITEM = "audio_quality_per_item" private const val AUDIO_QUALITY_PER_ITEM = "audio_quality_per_item"
private const val HOME_SECTOR_LIST = "home_sector_list" private const val HOME_SECTOR_LIST = "home_sector_list"
private const val RATING_PER_ITEM = "rating_per_item"
@JvmStatic @JvmStatic
@ -396,4 +397,9 @@ object Preferences {
fun setHomeSectorList(extension: List<HomeSector>?) { fun setHomeSectorList(extension: List<HomeSector>?) {
App.getInstance().preferences.edit().putString(HOME_SECTOR_LIST, Gson().toJson(extension)).apply() App.getInstance().preferences.edit().putString(HOME_SECTOR_LIST, Gson().toJson(extension)).apply()
} }
@JvmStatic
fun showItemRating(): Boolean {
return App.getInstance().preferences.getBoolean(RATING_PER_ITEM, false)
}
} }

View file

@ -4,6 +4,6 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <path
android:fillColor="?attr/colorOnPrimaryContainer" android:fillColor="@color/titleTextColor"
android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z" /> android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z" />
</vector> </vector>

View file

@ -1,5 +1,6 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
@ -58,7 +59,7 @@
android:singleLine="true" android:singleLine="true"
android:text="@string/label_placeholder" android:text="@string/label_placeholder"
app:layout_constraintBottom_toTopOf="@+id/search_result_song_subtitle_text_view" app:layout_constraintBottom_toTopOf="@+id/search_result_song_subtitle_text_view"
app:layout_constraintEnd_toStartOf="@+id/search_result_download_indicator_image_view" app:layout_constraintEnd_toStartOf="@+id/rating_indicator_image_view"
app:layout_constraintStart_toEndOf="@+id/cover_image_separator" app:layout_constraintStart_toEndOf="@+id/cover_image_separator"
app:layout_constraintTop_toTopOf="@+id/song_cover_image_view" app:layout_constraintTop_toTopOf="@+id/song_cover_image_view"
app:layout_constraintVertical_chainStyle="packed" /> app:layout_constraintVertical_chainStyle="packed" />
@ -73,10 +74,32 @@
android:singleLine="true" android:singleLine="true"
android:text="@string/label_placeholder" android:text="@string/label_placeholder"
app:layout_constraintBottom_toBottomOf="@+id/song_cover_image_view" app:layout_constraintBottom_toBottomOf="@+id/song_cover_image_view"
app:layout_constraintEnd_toStartOf="@+id/search_result_download_indicator_image_view" app:layout_constraintEnd_toStartOf="@+id/rating_indicator_image_view"
app:layout_constraintStart_toEndOf="@+id/cover_image_separator" app:layout_constraintStart_toEndOf="@+id/cover_image_separator"
app:layout_constraintTop_toBottomOf="@+id/search_result_song_title_text_view" /> app:layout_constraintTop_toBottomOf="@+id/search_result_song_title_text_view" />
<FrameLayout
android:id="@+id/rating_indicator_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="12dp"
app:layout_constraintBottom_toBottomOf="@+id/song_cover_image_view"
app:layout_constraintEnd_toStartOf="@+id/search_result_download_indicator_image_view"
app:layout_constraintStart_toEndOf="@+id/search_result_song_title_text_view"
app:layout_constraintTop_toTopOf="@+id/song_cover_image_view">
<ImageView
android:id="@+id/preferred_icon"
android:layout_width="18dp"
android:layout_height="18dp"
android:background="@drawable/ic_favorite"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/rating_bar"
app:layout_constraintEnd_toEndOf="@+id/rating_bar"
app:layout_constraintStart_toStartOf="@+id/rating_bar"
tools:visibility="visible" />
</FrameLayout>
<FrameLayout <FrameLayout
android:id="@+id/search_result_download_indicator_image_view" android:id="@+id/search_result_download_indicator_image_view"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -85,8 +108,9 @@
android:visibility="gone" android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/song_cover_image_view" app:layout_constraintBottom_toBottomOf="@+id/song_cover_image_view"
app:layout_constraintEnd_toStartOf="@+id/search_result_song_more_button" app:layout_constraintEnd_toStartOf="@+id/search_result_song_more_button"
app:layout_constraintStart_toEndOf="@+id/search_result_song_title_text_view" app:layout_constraintStart_toEndOf="@+id/rating_indicator_image_view"
app:layout_constraintTop_toTopOf="@+id/song_cover_image_view"> app:layout_constraintTop_toTopOf="@+id/song_cover_image_view"
tools:visibility="visible">
<ImageView <ImageView
android:layout_width="18dp" android:layout_width="18dp"

View file

@ -313,7 +313,7 @@
<string name="song_list_page_starred">Lieblingslieder</string> <string name="song_list_page_starred">Lieblingslieder</string>
<string name="song_list_page_top">%1$s\'s Top Tracks</string> <string name="song_list_page_top">%1$s\'s Top Tracks</string>
<string name="song_list_page_year">Jahr %1$d</string> <string name="song_list_page_year">Jahr %1$d</string>
<string name="song_subtitle_formatter">%1$s • %2$s %3$s</string> <string name="song_subtitle_formatter">%1$s • %2$s %3$s %4$s</string>
<string name="starred_sync_dialog_negative_button">Abbrechen</string> <string name="starred_sync_dialog_negative_button">Abbrechen</string>
<string name="starred_sync_dialog_neutral_button">Weiter</string> <string name="starred_sync_dialog_neutral_button">Weiter</string>
<string name="starred_sync_dialog_positive_button">Weiter und Herunterladen</string> <string name="starred_sync_dialog_positive_button">Weiter und Herunterladen</string>

View file

@ -328,7 +328,7 @@
<string name="song_list_page_starred">Titres favoris</string> <string name="song_list_page_starred">Titres favoris</string>
<string name="song_list_page_top">Les meilleurs titres de %1$s</string> <string name="song_list_page_top">Les meilleurs titres de %1$s</string>
<string name="song_list_page_year">Année %1$d</string> <string name="song_list_page_year">Année %1$d</string>
<string name="song_subtitle_formatter">%1$s • %2$s %3$s</string> <string name="song_subtitle_formatter">%1$s • %2$s %3$s %4$s</string>
<string name="starred_sync_dialog_negative_button">Annuler</string> <string name="starred_sync_dialog_negative_button">Annuler</string>
<string name="starred_sync_dialog_neutral_button">Continuer</string> <string name="starred_sync_dialog_neutral_button">Continuer</string>
<string name="starred_sync_dialog_positive_button">Continuer et télécharger</string> <string name="starred_sync_dialog_positive_button">Continuer et télécharger</string>

View file

@ -331,7 +331,7 @@
<string name="song_list_page_starred">즐겨찾기한 트랙</string> <string name="song_list_page_starred">즐겨찾기한 트랙</string>
<string name="song_list_page_top">%1$s\의 top tracks</string> <string name="song_list_page_top">%1$s\의 top tracks</string>
<string name="song_list_page_year">년도 %1$d</string> <string name="song_list_page_year">년도 %1$d</string>
<string name="song_subtitle_formatter">%1$s • %2$s %3$s</string> <string name="song_subtitle_formatter">%1$s • %2$s %3$s %4$s</string>
<string name="starred_sync_dialog_negative_button">취소</string> <string name="starred_sync_dialog_negative_button">취소</string>
<string name="starred_sync_dialog_neutral_button">계속</string> <string name="starred_sync_dialog_neutral_button">계속</string>
<string name="starred_sync_dialog_positive_button">계속해서 다운로드</string> <string name="starred_sync_dialog_positive_button">계속해서 다운로드</string>

View file

@ -330,7 +330,7 @@
<string name="song_list_page_starred">Músicas favoritas</string> <string name="song_list_page_starred">Músicas favoritas</string>
<string name="song_list_page_top">Músicas preferidas de %1$s</string> <string name="song_list_page_top">Músicas preferidas de %1$s</string>
<string name="song_list_page_year">Ano %1$d</string> <string name="song_list_page_year">Ano %1$d</string>
<string name="song_subtitle_formatter">%1$s • %2$s %3$s</string> <string name="song_subtitle_formatter">%1$s • %2$s %3$s %4$s</string>
<string name="starred_sync_dialog_negative_button">Cancelar</string> <string name="starred_sync_dialog_negative_button">Cancelar</string>
<string name="starred_sync_dialog_neutral_button">Continuar</string> <string name="starred_sync_dialog_neutral_button">Continuar</string>
<string name="starred_sync_dialog_positive_button">Continuar e baixar</string> <string name="starred_sync_dialog_positive_button">Continuar e baixar</string>

View file

@ -327,7 +327,7 @@
<string name="song_list_page_starred">已收藏的曲目</string> <string name="song_list_page_starred">已收藏的曲目</string>
<string name="song_list_page_top">%1$s 的热门曲目</string> <string name="song_list_page_top">%1$s 的热门曲目</string>
<string name="song_list_page_year">年份 %1$d</string> <string name="song_list_page_year">年份 %1$d</string>
<string name="song_subtitle_formatter">%1$s • %2$s %3$s</string> <string name="song_subtitle_formatter">%1$s • %2$s %3$s %4$s</string>
<string name="starred_sync_dialog_negative_button">取消</string> <string name="starred_sync_dialog_negative_button">取消</string>
<string name="starred_sync_dialog_neutral_button">继续</string> <string name="starred_sync_dialog_neutral_button">继续</string>
<string name="starred_sync_dialog_positive_button">继续并下载</string> <string name="starred_sync_dialog_positive_button">继续并下载</string>

View file

@ -271,7 +271,9 @@
<string name="settings_podcast">Show podcast</string> <string name="settings_podcast">Show podcast</string>
<string name="settings_podcast_summary">If enabled, show the podcast section. Restart the app for it to take full effect.</string> <string name="settings_podcast_summary">If enabled, show the podcast section. Restart the app for it to take full effect.</string>
<string name="settings_audio_quality">Show audio quality</string> <string name="settings_audio_quality">Show audio quality</string>
<string name="settings_audio_quality_summary">The bitrate and audio format will be shown for each audio track</string> <string name="settings_audio_quality_summary">The bitrate and audio format will be shown for each audio track.</string>
<string name="settings_item_rating">Show item rating</string>
<string name="settings_item_rating_summary">If enabled, the item\'s rating and whether it is marked as a favorite will be displayed.</string>
<string name="settings_queue_syncing_countdown">Sync timer</string> <string name="settings_queue_syncing_countdown">Sync timer</string>
<string name="settings_queue_syncing_summary">If enabled, the user will have the ability to save their play queue and will have the ability to load state when opening the application.</string> <string name="settings_queue_syncing_summary">If enabled, the user will have the ability to save their play queue and will have the ability to load state when opening the application.</string>
<string name="settings_queue_syncing_title">Sync play queue for this user</string> <string name="settings_queue_syncing_title">Sync play queue for this user</string>
@ -343,7 +345,7 @@
<string name="song_list_page_starred">Starred tracks</string> <string name="song_list_page_starred">Starred tracks</string>
<string name="song_list_page_top">%1$s\'s top tracks</string> <string name="song_list_page_top">%1$s\'s top tracks</string>
<string name="song_list_page_year">Year %1$d</string> <string name="song_list_page_year">Year %1$d</string>
<string name="song_subtitle_formatter">%1$s • %2$s %3$s</string> <string name="song_subtitle_formatter">%1$s • %2$s %3$s %4$s</string>
<string name="starred_sync_dialog_negative_button">Cancel</string> <string name="starred_sync_dialog_negative_button">Cancel</string>
<string name="starred_sync_dialog_neutral_button">Continue</string> <string name="starred_sync_dialog_neutral_button">Continue</string>
<string name="starred_sync_dialog_positive_button">Continue and download</string> <string name="starred_sync_dialog_positive_button">Continue and download</string>

View file

@ -57,6 +57,12 @@
android:summary="@string/settings_audio_quality_summary" android:summary="@string/settings_audio_quality_summary"
android:key="audio_quality_per_item" /> android:key="audio_quality_per_item" />
<SwitchPreference
android:title="@string/settings_item_rating"
android:defaultValue="false"
android:summary="@string/settings_item_rating_summary"
android:key="rating_per_item" />
<SwitchPreference <SwitchPreference
android:title="@string/settings_podcast" android:title="@string/settings_podcast"
android:defaultValue="true" android:defaultValue="true"