diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 437b0a49..bc23d336 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -28,4 +28,13 @@ -keep class com.maxrave.simpmusic.data.model.** { *; } -keep class com.maxrave.simpmusic.extension.AllExtKt { *; } -keep class com.maxrave.simpmusic.extension.AllExtKt$* { *; } --keep class com.maxrave.kotlinytmusicscraper.extension.MapExtKt$* { *; } \ No newline at end of file +-keep class com.maxrave.kotlinytmusicscraper.extension.MapExtKt$* { *; } + +# Removes all Logs as they cause perfomance issues in prod +-assumenosideeffects class android.util.Log { + public static int w(...); + public static int e(...); + public static int i(...); + public static int d(...); + public static int v(...); +} \ No newline at end of file diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/album/AlbumBrowse.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/album/AlbumBrowse.kt index 02a29466..aed8c481 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/album/AlbumBrowse.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/album/AlbumBrowse.kt @@ -1,10 +1,12 @@ package com.maxrave.simpmusic.data.model.browse.album +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.searchResult.songs.Artist import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail +@Immutable data class AlbumBrowse( @SerializedName("artists") val artists: List<Artist>, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/album/Track.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/album/Track.kt index c84cd642..a226f32a 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/album/Track.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/album/Track.kt @@ -1,12 +1,14 @@ package com.maxrave.simpmusic.data.model.browse.album +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.searchResult.songs.Album import com.maxrave.simpmusic.data.model.searchResult.songs.Artist import com.maxrave.simpmusic.data.model.searchResult.songs.FeedbackTokens import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail +@Immutable data class Track( @SerializedName("album") val album: Album?, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/AlbumPlaylist.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/AlbumPlaylist.kt index 32ffbc8b..ffba1ab7 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/AlbumPlaylist.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/AlbumPlaylist.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.browse.playlist +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class AlbumPlaylist( @SerializedName("id") val id: Any, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/Author.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/Author.kt index f225f159..e145aa5f 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/Author.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/Author.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.browse.playlist +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class Author( @SerializedName("id") val id: String, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/PlaylistBrowse.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/PlaylistBrowse.kt index c15db246..384fac9f 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/PlaylistBrowse.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/PlaylistBrowse.kt @@ -1,10 +1,12 @@ package com.maxrave.simpmusic.data.model.browse.playlist +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.browse.album.Track import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail +@Immutable data class PlaylistBrowse( @SerializedName("author") val author: Author, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/TrackPlaylist.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/TrackPlaylist.kt index 280f5891..f5f596e6 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/TrackPlaylist.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/browse/playlist/TrackPlaylist.kt @@ -1,10 +1,12 @@ package com.maxrave.simpmusic.data.model.browse.playlist +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.searchResult.songs.Artist import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail +@Immutable data class TrackPlaylist( @SerializedName("album") val albumPlaylist: AlbumPlaylist, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/Genre.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/Genre.kt index f666dcfb..f325bc2d 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/Genre.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/Genre.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.explore.mood +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class Genre( @SerializedName("params") val params: String, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/Mood.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/Mood.kt index f48e4e1c..163516bd 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/Mood.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/Mood.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.explore.mood +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class Mood( @SerializedName(value = "Genres", alternate = ["Thể loại", "Gatunki", "Per te"]) val genres: ArrayList<Genre>, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/MoodsMoment.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/MoodsMoment.kt index e0734b51..3378632e 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/MoodsMoment.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/MoodsMoment.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.explore.mood +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class MoodsMoment( @SerializedName("params") val params: String, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/Content.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/Content.kt index b3e2a0e3..08f34477 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/Content.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/Content.kt @@ -1,10 +1,12 @@ package com.maxrave.simpmusic.data.model.explore.mood.genre +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail import com.maxrave.simpmusic.data.type.HomeContentType +@Immutable data class Content( @SerializedName("playlistBrowseId") val playlistBrowseId: String, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/GenreObject.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/GenreObject.kt index 6df7687f..d04eed5b 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/GenreObject.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/GenreObject.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.explore.mood.genre +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class GenreObject( @SerializedName("header") val header: String, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/ItemsPlaylist.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/ItemsPlaylist.kt index 9e297efc..ac46374b 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/ItemsPlaylist.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/ItemsPlaylist.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.explore.mood.genre +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class ItemsPlaylist( @SerializedName("contents") val contents: List<Content>, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/ItemsSong.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/ItemsSong.kt index 72bc58af..f2005254 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/ItemsSong.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/ItemsSong.kt @@ -1,7 +1,9 @@ package com.maxrave.simpmusic.data.model.explore.mood.genre +import androidx.compose.runtime.Immutable import com.maxrave.simpmusic.data.model.searchResult.songs.Artist +@Immutable data class ItemsSong( val title: String, val artist: List<Artist>?, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/Title.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/Title.kt index 76171d88..dfee4874 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/Title.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/genre/Title.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.explore.mood.genre +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class Title( @SerializedName("subtitle") val subtitle: String, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/Content.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/Content.kt index a9268e26..bfcb7023 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/Content.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/Content.kt @@ -1,10 +1,12 @@ package com.maxrave.simpmusic.data.model.explore.mood.moodmoments +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail import com.maxrave.simpmusic.data.type.HomeContentType +@Immutable data class Content( @SerializedName("playlistBrowseId") val playlistBrowseId: String, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/Item.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/Item.kt index ec1f6caf..ee97ec8c 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/Item.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/Item.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.explore.mood.moodmoments +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class Item( @SerializedName("contents") val contents: List<Content>, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/MoodsMomentObject.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/MoodsMomentObject.kt index b3cd8907..8f4819ba 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/MoodsMomentObject.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/explore/mood/moodmoments/MoodsMomentObject.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.explore.mood.moodmoments +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class MoodsMomentObject( @SerializedName("endpoint") val endpoint: String, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/Content.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/Content.kt index 1f63e367..9a40dba9 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/Content.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/Content.kt @@ -1,12 +1,14 @@ package com.maxrave.simpmusic.data.model.home +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.searchResult.songs.Album import com.maxrave.simpmusic.data.model.searchResult.songs.Artist import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail import com.maxrave.simpmusic.data.type.HomeContentType +@Immutable data class Content( @SerializedName("album") val album: Album?, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeDataCombine.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeDataCombine.kt index fc706bae..dbfe10b2 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeDataCombine.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeDataCombine.kt @@ -1,13 +1,14 @@ package com.maxrave.simpmusic.data.model.home +import androidx.compose.runtime.Immutable import com.maxrave.simpmusic.data.model.explore.mood.Mood import com.maxrave.simpmusic.data.model.home.chart.Chart import com.maxrave.simpmusic.utils.Resource +@Immutable data class HomeDataCombine( val home: Resource<ArrayList<HomeItem>>, val mood: Resource<Mood>, val chart: Resource<Chart>, val newRelease: Resource<ArrayList<HomeItem>>, -) { -} \ No newline at end of file +) \ No newline at end of file diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeItem.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeItem.kt index 404a09a0..7b28d48f 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeItem.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeItem.kt @@ -1,9 +1,11 @@ package com.maxrave.simpmusic.data.model.home +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail +@Immutable data class HomeItem( @SerializedName("contents") val contents: List<Content?>, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeResponse.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeResponse.kt index 7af78da7..76bc00e8 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeResponse.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/HomeResponse.kt @@ -1,10 +1,12 @@ package com.maxrave.simpmusic.data.model.home +import androidx.compose.runtime.Immutable import com.maxrave.simpmusic.data.model.explore.mood.Mood import com.maxrave.simpmusic.data.model.home.chart.Chart import com.maxrave.simpmusic.utils.Resource +@Immutable data class HomeResponse( val homeItem: Resource<ArrayList<HomeItem>>, val exploreMood: Resource<Mood>, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Artists.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Artists.kt index 68a26958..c174edb8 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Artists.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Artists.kt @@ -1,8 +1,11 @@ package com.maxrave.simpmusic.data.model.home.chart +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName + +@Immutable data class Artists( @SerializedName("items") val itemArtists: ArrayList<ItemArtist>, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Chart.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Chart.kt index 2b1bf2f0..6cdf78d8 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Chart.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Chart.kt @@ -1,9 +1,11 @@ package com.maxrave.simpmusic.data.model.home.chart +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.browse.album.Track +@Immutable data class Chart( @SerializedName("artists") val artists: Artists, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Countries.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Countries.kt index 91d21090..77f367c7 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Countries.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Countries.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.home.chart +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class Countries( @SerializedName("options") val options: List<String>, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/ItemArtist.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/ItemArtist.kt index 8b5fe176..04072a2f 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/ItemArtist.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/ItemArtist.kt @@ -1,9 +1,11 @@ package com.maxrave.simpmusic.data.model.home.chart +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail +@Immutable data class ItemArtist( @SerializedName("browseId") val browseId: String, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/ItemVideo.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/ItemVideo.kt index a84886aa..c9870d3b 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/ItemVideo.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/ItemVideo.kt @@ -1,11 +1,13 @@ package com.maxrave.simpmusic.data.model.home.chart +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName import com.maxrave.simpmusic.data.model.browse.album.Track import com.maxrave.simpmusic.data.model.searchResult.songs.Artist import com.maxrave.simpmusic.data.model.searchResult.songs.Thumbnail +@Immutable data class ItemVideo( @SerializedName("artists") val artists: List<Artist>?, @@ -20,6 +22,7 @@ data class ItemVideo( @SerializedName("views") val views: String ) + fun ItemVideo.toTrack(): Track { return Track( album = null, diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Selected.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Selected.kt index 729ccc08..1c0b6f2a 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Selected.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Selected.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.home.chart +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class Selected( @SerializedName("text") val text: String diff --git a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Videos.kt b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Videos.kt index 48d5e0b1..c1b9a97c 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Videos.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/model/home/chart/Videos.kt @@ -1,8 +1,10 @@ package com.maxrave.simpmusic.data.model.home.chart +import androidx.compose.runtime.Immutable import com.google.gson.annotations.SerializedName +@Immutable data class Videos( @SerializedName("items") val items: ArrayList<ItemVideo>, diff --git a/app/src/main/java/com/maxrave/simpmusic/ui/screen/home/HomeScreen.kt b/app/src/main/java/com/maxrave/simpmusic/ui/screen/home/HomeScreen.kt index 203deb02..a2863d66 100644 --- a/app/src/main/java/com/maxrave/simpmusic/ui/screen/home/HomeScreen.kt +++ b/app/src/main/java/com/maxrave/simpmusic/ui/screen/home/HomeScreen.kt @@ -75,6 +75,7 @@ import com.maxrave.kotlinytmusicscraper.config.Constants import com.maxrave.simpmusic.R import com.maxrave.simpmusic.common.CHART_SUPPORTED_COUNTRY import com.maxrave.simpmusic.common.Config +import com.maxrave.simpmusic.common.LIMIT_CACHE_SIZE.data import com.maxrave.simpmusic.data.model.browse.album.Track import com.maxrave.simpmusic.data.model.explore.mood.Mood import com.maxrave.simpmusic.data.model.home.HomeItem @@ -207,21 +208,24 @@ fun HomeScreen( enter = fadeIn() + expandVertically(), exit = fadeOut() + shrinkVertically() ) { - Spacer(modifier = Modifier - .fillMaxWidth() - .windowInsetsPadding( - WindowInsets.statusBars - )) + Spacer( + modifier = Modifier + .fillMaxWidth() + .windowInsetsPadding( + WindowInsets.statusBars + ) + ) } - Row ( + Row( modifier = Modifier .horizontalScroll(chipRowState) .padding(vertical = 8.dp, horizontal = 15.dp), ) { Config.listOfHomeChip.forEach { id -> Spacer(modifier = Modifier.width(4.dp)) - Chip(isSelected = - when(params) { + Chip( + isSelected = + when (params) { Constants.HOME_PARAMS_RELAX -> id == R.string.relax Constants.HOME_PARAMS_SLEEP -> id == R.string.sleep Constants.HOME_PARAMS_ENERGIZE -> id == R.string.energize @@ -233,8 +237,9 @@ fun HomeScreen( Constants.HOME_PARAMS_COMMUTE -> id == R.string.commute Constants.HOME_PARAMS_FOCUS -> id == R.string.focus else -> id == R.string.all - }, text = stringResource(id = id)) { - when(id) { + }, text = stringResource(id = id) + ) { + when (id) { R.string.all -> viewModel.setParams(null) R.string.relax -> viewModel.setParams(Constants.HOME_PARAMS_RELAX) R.string.sleep -> viewModel.setParams(Constants.HOME_PARAMS_SLEEP) @@ -289,26 +294,26 @@ fun HomeScreen( item { androidx.compose.animation.AnimatedVisibility( visible = + homeData.find { + it.title == + context.getString( + R.string.quick_picks, + ) + } != null, + ) { + QuickPicks( + homeItem = homeData.find { it.title == context.getString( R.string.quick_picks, ) - } != null, - ) { - QuickPicks( - homeItem = - homeData.find { - it.title == - context.getString( - R.string.quick_picks, - ) - } ?: return@AnimatedVisibility, + } ?: return@AnimatedVisibility, viewModel = viewModel, ) } } - items(homeData) { + items(homeData, key = { it.title + it.channelId }) { if (it.title != context.getString(R.string.quick_picks)) { HomeItem( homeViewModel = viewModel, @@ -317,7 +322,7 @@ fun HomeScreen( ) } } - items(newRelease) { + items(newRelease, key = { it.title + it.channelId }) { androidx.compose.animation.AnimatedVisibility( visible = newRelease.isNotEmpty(), ) { @@ -426,23 +431,23 @@ fun HomeTopAppBar(navController: NavController) { ) Text( text = - when (hour) { - in 6..12 -> { - stringResource(R.string.good_morning) - } + when (hour) { + in 6..12 -> { + stringResource(R.string.good_morning) + } - in 13..17 -> { - stringResource(R.string.good_afternoon) - } + in 13..17 -> { + stringResource(R.string.good_afternoon) + } - in 18..23 -> { - stringResource(R.string.good_evening) - } + in 18..23 -> { + stringResource(R.string.good_evening) + } - else -> { - stringResource(R.string.good_night) - } - }, + else -> { + stringResource(R.string.good_night) + } + }, style = typo.bodySmall, ) } @@ -504,8 +509,8 @@ fun AccountLayout( style = typo.headlineMedium, color = Color.White, modifier = - Modifier - .padding(start = 8.dp), + Modifier + .padding(start = 8.dp), ) } } @@ -552,25 +557,26 @@ fun QuickPicks( state = lazyListState, flingBehavior = snapperFlingBehavior, ) { - items(homeItem.contents) { + items(homeItem.contents, key = { it?.videoId ?: "item_${it.hashCode()}" }) { if (it != null) { - QuickPicksItem(onClick = { - val firstQueue: Track = it.toTrack() - viewModel.setQueueData( - QueueData( - listTracks = arrayListOf(firstQueue), - firstPlayedTrack = firstQueue, - playlistId = "RDAMVM${it.videoId}", - playlistName = "\"${it.title}\" Radio", - playlistType = PlaylistType.RADIO, - continuation = null + QuickPicksItem( + onClick = { + val firstQueue: Track = it.toTrack() + viewModel.setQueueData( + QueueData( + listTracks = arrayListOf(firstQueue), + firstPlayedTrack = firstQueue, + playlistId = "RDAMVM${it.videoId}", + playlistName = "\"${it.title}\" Radio", + playlistType = PlaylistType.RADIO, + continuation = null + ) ) - ) - viewModel.loadMediaItem( - firstQueue, - type = Config.SONG_CLICK, - ) - }, + viewModel.loadMediaItem( + firstQueue, + type = Config.SONG_CLICK, + ) + }, data = it, widthDp = widthDp, ) @@ -615,7 +621,7 @@ fun MoodMomentAndGenre( state = lazyListState1, flingBehavior = snapperFlingBehavior1, ) { - items(mood.moodsMoments) { + items(mood.moodsMoments, key = { it.title }) { MoodMomentAndGenreHomeItem(title = it.title) { navController.navigateSafe( R.id.action_global_moodFragment, @@ -640,7 +646,7 @@ fun MoodMomentAndGenre( state = lazyListState2, flingBehavior = snapperFlingBehavior2, ) { - items(mood.genres) { + items(mood.genres, key = { it.title }) { MoodMomentAndGenreHomeItem(title = it.title) { navController.navigateSafe( R.id.action_global_moodFragment, @@ -727,16 +733,15 @@ fun ChartData( state = lazyListState1, flingBehavior = snapperFlingBehavior1, ) { - items(chart.songs.size) { - val data = chart.songs[it] + items(chart.songs, key = { it.videoId }) { ItemTrackChart(onClick = { viewModel.setQueueData( QueueData( - listTracks = arrayListOf(data), - firstPlayedTrack = data, - playlistName = "\"${data.title}\" ${context.getString(R.string.in_charts)}", + listTracks = arrayListOf(it), + firstPlayedTrack = it, + playlistName = "\"${it.title}\" ${context.getString(R.string.in_charts)}", playlistType = PlaylistType.RADIO, - playlistId = "RDAMVM${data.videoId}", + playlistId = "RDAMVM${it.videoId}", continuation = null ) ) @@ -744,7 +749,7 @@ fun ChartData( data, type = Config.VIDEO_CLICK, ) - }, data = data, position = it + 1, widthDp = gridWidthDp) + }, data = it, position = chart.songs.indexOf(it) + 1, widthDp = gridWidthDp) } } } @@ -763,7 +768,7 @@ fun ChartData( state = lazyListState, flingBehavior = snapperFlingBehavior ) { - items(chart.videos.items.size) { + items(chart.videos.items.size, key = { index -> chart.videos.items[index].videoId }) { val data = chart.videos.items[it] ItemVideoChart( onClick = { @@ -802,7 +807,10 @@ fun ChartData( state = lazyListState2, flingBehavior = snapperFlingBehavior2, ) { - items(chart.artists.itemArtists.size) { + items(chart.artists.itemArtists.size, key = { index -> + val item = chart.artists.itemArtists[index] + item.title + item.browseId + }) { val data = chart.artists.itemArtists[it] ItemArtistChart(onClick = { val args = Bundle() @@ -829,7 +837,10 @@ fun ChartData( state = lazyListState3, flingBehavior = snapperFlingBehavior3, ) { - items(chart.trending.size) { + items(chart.trending.size, key = { index -> + val item = chart.trending[index] + item.videoId + }) { val data = chart.trending[it] ItemTrackChart(onClick = { viewModel.setQueueData( diff --git a/app/src/main/java/com/maxrave/simpmusic/ui/screen/library/PlaylistScreen.kt b/app/src/main/java/com/maxrave/simpmusic/ui/screen/library/PlaylistScreen.kt index ac7583b4..6d261904 100644 --- a/app/src/main/java/com/maxrave/simpmusic/ui/screen/library/PlaylistScreen.kt +++ b/app/src/main/java/com/maxrave/simpmusic/ui/screen/library/PlaylistScreen.kt @@ -155,10 +155,10 @@ fun PlaylistScreen( initialValue = -limit, targetValue = limit, animationSpec = - infiniteRepeatable( - animation = tween(5000, easing = LinearEasing), - repeatMode = RepeatMode.Reverse, - ), + infiniteRepeatable( + animation = tween(5000, easing = LinearEasing), + repeatMode = RepeatMode.Reverse, + ), label = "shimmer", ) val infiniteTransition = rememberInfiniteTransition(label = "rotation") @@ -166,10 +166,10 @@ fun PlaylistScreen( initialValue = 0f, targetValue = 360f, animationSpec = - infiniteRepeatable( - animation = tween(5000, easing = LinearEasing), - repeatMode = RepeatMode.Restart, - ), + infiniteRepeatable( + animation = tween(5000, easing = LinearEasing), + repeatMode = RepeatMode.Restart, + ), label = "rotation", ) @@ -297,23 +297,23 @@ fun PlaylistScreen( // Box { LazyColumn( modifier = - Modifier - .fillMaxWidth() - .background(Color.Black), + Modifier + .fillMaxWidth() + .background(Color.Black), state = lazyState, ) { item(contentType = "header") { Box( modifier = - Modifier - .fillMaxWidth() - .wrapContentHeight() - .background(Color.Transparent), + Modifier + .fillMaxWidth() + .wrapContentHeight() + .background(Color.Transparent), ) { Box( modifier = - Modifier - .fillMaxWidth(), + Modifier + .fillMaxWidth(), // .haze( // hazeState, // style = HazeMaterials.regular(), @@ -330,20 +330,20 @@ fun PlaylistScreen( ) Box( modifier = - Modifier - .fillMaxWidth() - .height(180.dp) - .align(Alignment.BottomCenter) - .background( - brush = - Brush.verticalGradient( - listOf( - Color.Transparent, - Color(0x75000000), - Color.Black, - ), - ), + Modifier + .fillMaxWidth() + .height(180.dp) + .align(Alignment.BottomCenter) + .background( + brush = + Brush.verticalGradient( + listOf( + Color.Transparent, + Color(0x75000000), + Color.Black, + ), ), + ), ) } Column( @@ -353,10 +353,10 @@ fun PlaylistScreen( ) { Row( modifier = - Modifier - .wrapContentWidth() - .padding(16.dp) - .windowInsetsPadding(WindowInsets.statusBars), + Modifier + .wrapContentWidth() + .padding(16.dp) + .windowInsetsPadding(WindowInsets.statusBars), ) { RippleIconButton( resId = R.drawable.baseline_arrow_back_ios_new_24, @@ -382,19 +382,19 @@ fun PlaylistScreen( bitmap = it.result.image.toBitmap().asImageBitmap() }, modifier = - Modifier - .height(250.dp) - .wrapContentWidth() - .align(Alignment.CenterHorizontally) - .clip( - RoundedCornerShape(8.dp), - ), + Modifier + .height(250.dp) + .wrapContentWidth() + .align(Alignment.CenterHorizontally) + .clip( + RoundedCornerShape(8.dp), + ), ) Box( modifier = - Modifier - .fillMaxWidth() - .wrapContentHeight(), + Modifier + .fillMaxWidth() + .wrapContentHeight(), ) { Column(Modifier.padding(horizontal = 32.dp)) { Spacer(modifier = Modifier.size(25.dp)) @@ -428,7 +428,7 @@ fun PlaylistScreen( } Row( modifier = - Modifier.fillMaxWidth(), + Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { RippleIconButton( @@ -444,27 +444,29 @@ fun PlaylistScreen( DownloadState.STATE_DOWNLOADED -> { Box( modifier = - Modifier - .size(36.dp) - .clip( - CircleShape, - ).clickable { - Toast - .makeText( - context, - context.getString(R.string.downloaded), - Toast.LENGTH_SHORT, - ).show() - }, + Modifier + .size(36.dp) + .clip( + CircleShape, + ) + .clickable { + Toast + .makeText( + context, + context.getString(R.string.downloaded), + Toast.LENGTH_SHORT, + ) + .show() + }, ) { Icon( painter = painterResource(id = R.drawable.baseline_downloaded), tint = Color(0xFF00A0CB), contentDescription = "", modifier = - Modifier - .size(36.dp) - .padding(2.dp), + Modifier + .size(36.dp) + .padding(2.dp), ) } } @@ -472,18 +474,20 @@ fun PlaylistScreen( DownloadState.STATE_DOWNLOADING -> { Box( modifier = - Modifier - .size(36.dp) - .clip( - CircleShape, - ).clickable { - Toast - .makeText( - context, - context.getString(R.string.downloading), - Toast.LENGTH_SHORT, - ).show() - }, + Modifier + .size(36.dp) + .clip( + CircleShape, + ) + .clickable { + Toast + .makeText( + context, + context.getString(R.string.downloading), + Toast.LENGTH_SHORT, + ) + .show() + }, ) { LottieAnimation( composition, @@ -510,55 +514,57 @@ fun PlaylistScreen( AnimatedVisibility(visible = shouldShowSuggestButton) { Box( modifier = - Modifier - .size(36.dp) - .clip(CircleShape) - .graphicsLayer { - compositingStrategy = - CompositingStrategy.Offscreen - }.clickable { - shouldShowSuggestions = !shouldShowSuggestions - }.drawWithCache { - val width = size.width - 10 - val height = size.height - 10 - - val offsetDraw = width * progressAnimated - val gradientColors = - listOf( - Color(0xFF4C82EF), - Color(0xFFD96570), - ) - val brush = - Brush.linearGradient( - colors = gradientColors, - start = Offset(offsetDraw, 0f), - end = - Offset( - offsetDraw + width, - height, - ), - ) + Modifier + .size(36.dp) + .clip(CircleShape) + .graphicsLayer { + compositingStrategy = + CompositingStrategy.Offscreen + } + .clickable { + shouldShowSuggestions = !shouldShowSuggestions + } + .drawWithCache { + val width = size.width - 10 + val height = size.height - 10 - onDrawBehind { - // Destination - with(aiPainter) { - draw( - size = Size(width, width), - ) - } + val offsetDraw = width * progressAnimated + val gradientColors = + listOf( + Color(0xFF4C82EF), + Color(0xFFD96570), + ) + val brush = + Brush.linearGradient( + colors = gradientColors, + start = Offset(offsetDraw, 0f), + end = + Offset( + offsetDraw + width, + height, + ), + ) - // Source - drawRect( - brush = brush, - blendMode = BlendMode.SrcIn, + onDrawBehind { + // Destination + with(aiPainter) { + draw( + size = Size(width, width), ) } - }, + + // Source + drawRect( + brush = brush, + blendMode = BlendMode.SrcIn, + ) + } + }, ) } RippleIconButton( modifier = - Modifier.size(36.dp), + Modifier.size(36.dp), resId = R.drawable.baseline_shuffle_24, fillMaxSize = true, ) { @@ -567,7 +573,7 @@ fun PlaylistScreen( Spacer(Modifier.size(5.dp)) RippleIconButton( modifier = - Modifier.size(36.dp), + Modifier.size(36.dp), resId = R.drawable.baseline_more_vert_24, fillMaxSize = true, ) { @@ -603,9 +609,9 @@ fun PlaylistScreen( Spacer(modifier = Modifier.size(8.dp)) Text( text = - stringResource( - id = R.string.suggest, - ), + stringResource( + id = R.string.suggest, + ), color = Color.White, modifier = Modifier.padding(vertical = 8.dp), ) @@ -614,10 +620,10 @@ fun PlaylistScreen( if (it) { CenterLoadingBox( modifier = - Modifier - .fillMaxWidth() - .height(200.dp) - .align(Alignment.CenterHorizontally), + Modifier + .fillMaxWidth() + .height(200.dp) + .align(Alignment.CenterHorizontally), ) } else { Column { @@ -642,62 +648,62 @@ fun PlaylistScreen( TextButton( onClick = { viewModel.reloadSuggestion() }, modifier = - Modifier - .padding(horizontal = 8.dp) - .drawWithContent { - val strokeWidthPx = 2.dp.toPx() - val width = size.width - val height = size.height + Modifier + .padding(horizontal = 8.dp) + .drawWithContent { + val strokeWidthPx = 2.dp.toPx() + val width = size.width + val height = size.height - drawContent() + drawContent() - with(drawContext.canvas.nativeCanvas) { - val checkPoint = saveLayer(null, null) + with(drawContext.canvas.nativeCanvas) { + val checkPoint = saveLayer(null, null) - // Destination - drawRoundRect( - cornerRadius = CornerRadius(x = 60f, y = 60f), - color = Color.Gray, - topLeft = Offset(strokeWidthPx / 2, strokeWidthPx / 2), - size = Size(width - strokeWidthPx, height - strokeWidthPx), - style = Stroke(strokeWidthPx), + // Destination + drawRoundRect( + cornerRadius = CornerRadius(x = 60f, y = 60f), + color = Color.Gray, + topLeft = Offset(strokeWidthPx / 2, strokeWidthPx / 2), + size = Size(width - strokeWidthPx, height - strokeWidthPx), + style = Stroke(strokeWidthPx), + ) + val gradientColors = + listOf( + Color(0xFF4C82EF), + Color(0xFFD96570), + ) + val brush = + Brush.linearGradient( + colors = gradientColors, + start = Offset(2f, 0f), + end = + Offset( + 2 + width, + height, + ), ) - val gradientColors = - listOf( - Color(0xFF4C82EF), - Color(0xFFD96570), - ) - val brush = - Brush.linearGradient( - colors = gradientColors, - start = Offset(2f, 0f), - end = - Offset( - 2 + width, - height, - ), - ) - - // Source - rotate(degrees = angle) { - drawCircle( - brush = brush, - radius = size.width, - blendMode = BlendMode.SrcIn, - ) - } - restoreToCount(checkPoint) + // Source + rotate(degrees = angle) { + drawCircle( + brush = brush, + radius = size.width, + blendMode = BlendMode.SrcIn, + ) } - }, + + restoreToCount(checkPoint) + } + }, ) { Text( text = stringResource(id = R.string.reload), color = Color.White, modifier = - Modifier.align( - Alignment.CenterVertically, - ), + Modifier.align( + Alignment.CenterVertically, + ), ) } Spacer(modifier = Modifier.size(12.dp)) @@ -711,8 +717,8 @@ fun PlaylistScreen( ElevatedButton( contentPadding = PaddingValues(0.dp), modifier = - Modifier - .defaultMinSize(minWidth = 1.dp, minHeight = 1.dp), + Modifier + .defaultMinSize(minWidth = 1.dp, minHeight = 1.dp), onClick = { viewModel.onUIEvent(LocalPlaylistUIEvent.ChangeFilter) }, @@ -742,7 +748,10 @@ fun PlaylistScreen( } } } - items(count = trackPagingItems.itemCount) { index -> + items(count = trackPagingItems.itemCount, key = { index -> + val item = trackPagingItems[index] + item?.videoId ?: "item_$index" + }) { index -> val item = trackPagingItems[index] if (item != null) { if (playingTrack?.mediaId == item.videoId && isPlaying) {