mirror of
https://github.com/antebudimir/tempus.git
synced 2025-12-31 17:43:32 +00:00
feat: as an option show the item's rating and whether it is marked as a favorite
This commit is contained in:
parent
4b9eaa8c3d
commit
58d540b939
12 changed files with 70 additions and 14 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue