Skip to content

Commit ffd83e6

Browse files
authored
Merge pull request #1991 from theovilardo/fix/beta-7-pre-release-fixes
Gradient removed form HomeScreen topbar
2 parents 6185863 + 60bb527 commit ffd83e6

25 files changed

Lines changed: 3126 additions & 94 deletions

app/schemas/com.theveloper.pixelplay.data.database.PixelPlayDatabase/41.json

Lines changed: 2749 additions & 0 deletions
Large diffs are not rendered by default.

app/src/main/AndroidManifest.xml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@
5353
android:label="@string/app_name"
5454
android:theme="@style/Theme.PixelPlay"
5555
android:launchMode="singleTop"
56-
android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize">
56+
android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize"
57+
android:windowSoftInputMode="adjustResize">
5758
<intent-filter>
5859
<action android:name="android.intent.action.MAIN" />
5960

@@ -78,37 +79,43 @@
7879
android:name=".presentation.telegram.auth.TelegramLoginActivity"
7980
android:exported="false"
8081
android:label="Telegram Login"
81-
android:theme="@style/Theme.PixelPlay" />
82+
android:theme="@style/Theme.PixelPlay"
83+
android:windowSoftInputMode="adjustResize" />
8284

8385
<activity
8486
android:name=".presentation.netease.auth.NeteaseLoginActivity"
8587
android:exported="false"
8688
android:label="Netease Login"
87-
android:theme="@style/Theme.PixelPlay" />
89+
android:theme="@style/Theme.PixelPlay"
90+
android:windowSoftInputMode="adjustResize" />
8891

8992
<activity
9093
android:name=".presentation.gdrive.auth.GDriveLoginActivity"
9194
android:exported="false"
9295
android:label="Google Drive Login"
93-
android:theme="@style/Theme.PixelPlay" />
96+
android:theme="@style/Theme.PixelPlay"
97+
android:windowSoftInputMode="adjustResize" />
9498

9599
<activity
96100
android:name=".presentation.qqmusic.auth.QqMusicLoginActivity"
97101
android:exported="false"
98102
android:label="QQ Music Login"
99-
android:theme="@style/Theme.PixelPlay" />
103+
android:theme="@style/Theme.PixelPlay"
104+
android:windowSoftInputMode="adjustResize" />
100105

101106
<activity
102107
android:name=".presentation.navidrome.auth.NavidromeLoginActivity"
103108
android:exported="false"
104109
android:label="Navidrome Login"
105-
android:theme="@style/Theme.PixelPlay" />
110+
android:theme="@style/Theme.PixelPlay"
111+
android:windowSoftInputMode="adjustResize" />
106112

107113
<activity
108114
android:name=".presentation.jellyfin.auth.JellyfinLoginActivity"
109115
android:exported="false"
110116
android:label="Jellyfin Login"
111-
android:theme="@style/Theme.PixelPlay" />
117+
android:theme="@style/Theme.PixelPlay"
118+
android:windowSoftInputMode="adjustResize" />
112119

113120

114121
<activity

app/src/main/java/com/theveloper/pixelplay/data/database/AlbumEntity.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import com.theveloper.pixelplay.utils.normalizeMetadataTextOrEmpty
1313
indices = [
1414
Index(value = ["title"], unique = false),
1515
Index(value = ["artist_id"], unique = false), // Para buscar álbumes por artista
16-
Index(value = ["artist_name"], unique = false) // Nuevo índice para búsquedas por nombre de artista del álbum
16+
Index(value = ["artist_name"], unique = false), // Nuevo índice para búsquedas por nombre de artista del álbum
17+
Index(value = ["album_artist"], unique = false) // Album artist tag from metadata (TPE2)
1718
]
1819
)
1920
data class AlbumEntity(
@@ -24,7 +25,8 @@ data class AlbumEntity(
2425
@ColumnInfo(name = "album_art_uri_string") val albumArtUriString: String?,
2526
@ColumnInfo(name = "song_count") val songCount: Int,
2627
@ColumnInfo(name = "date_added") val dateAdded: Long,
27-
@ColumnInfo(name = "year") val year: Int
28+
@ColumnInfo(name = "year") val year: Int,
29+
@ColumnInfo(name = "album_artist") val albumArtist: String? = null
2830
)
2931

3032
fun AlbumEntity.toAlbum(): Album {
@@ -38,6 +40,7 @@ fun AlbumEntity.toAlbum(): Album {
3840
id = this.id,
3941
title = this.title.normalizeMetadataTextOrEmpty(),
4042
artist = this.artistName.normalizeMetadataTextOrEmpty(),
43+
albumArtist = this.albumArtist?.normalizeMetadataTextOrEmpty()?.takeIf { it.isNotBlank() },
4144
albumArtUriString = effectiveAlbumArtUri,
4245
songCount = this.songCount,
4346
dateAdded = this.dateAdded,
@@ -58,6 +61,7 @@ fun Album.toEntity(artistIdForAlbum: Long): AlbumEntity { // Necesitamos pasar e
5861
albumArtUriString = this.albumArtUriString,
5962
songCount = this.songCount,
6063
dateAdded = this.dateAdded,
61-
year = this.year
64+
year = this.year,
65+
albumArtist = this.albumArtist
6266
)
6367
}

app/src/main/java/com/theveloper/pixelplay/data/database/MusicDao.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,8 +1083,8 @@ interface MusicDao {
10831083
ORDER BY
10841084
CASE WHEN :sortOrder = 'album_title_az' THEN albums.title END COLLATE NOCASE ASC,
10851085
CASE WHEN :sortOrder = 'album_title_za' THEN albums.title END COLLATE NOCASE DESC,
1086-
CASE WHEN :sortOrder = 'album_artist' THEN albums.artist_name END COLLATE NOCASE ASC,
1087-
CASE WHEN :sortOrder = 'album_artist_desc' THEN albums.artist_name END COLLATE NOCASE DESC,
1086+
CASE WHEN :sortOrder = 'album_artist' THEN COALESCE(NULLIF(TRIM(albums.album_artist), ''), albums.artist_name) END COLLATE NOCASE ASC,
1087+
CASE WHEN :sortOrder = 'album_artist_desc' THEN COALESCE(NULLIF(TRIM(albums.album_artist), ''), albums.artist_name) END COLLATE NOCASE DESC,
10881088
CASE WHEN :sortOrder = 'album_release_year' THEN albums.year END DESC,
10891089
CASE WHEN :sortOrder = 'album_release_year_asc' THEN albums.year END ASC,
10901090
CASE WHEN :sortOrder = 'album_date_added' THEN albums.date_added END DESC,
@@ -1138,8 +1138,8 @@ interface MusicDao {
11381138
ORDER BY
11391139
CASE WHEN :sortOrder = 'album_title_az' THEN albums.title END COLLATE NOCASE ASC,
11401140
CASE WHEN :sortOrder = 'album_title_za' THEN albums.title END COLLATE NOCASE DESC,
1141-
CASE WHEN :sortOrder = 'album_artist' THEN albums.artist_name END COLLATE NOCASE ASC,
1142-
CASE WHEN :sortOrder = 'album_artist_desc' THEN albums.artist_name END COLLATE NOCASE DESC,
1141+
CASE WHEN :sortOrder = 'album_artist' THEN COALESCE(NULLIF(TRIM(albums.album_artist), ''), albums.artist_name) END COLLATE NOCASE ASC,
1142+
CASE WHEN :sortOrder = 'album_artist_desc' THEN COALESCE(NULLIF(TRIM(albums.album_artist), ''), albums.artist_name) END COLLATE NOCASE DESC,
11431143
CASE WHEN :sortOrder = 'album_release_year' THEN albums.year END DESC,
11441144
CASE WHEN :sortOrder = 'album_release_year_asc' THEN albums.year END ASC,
11451145
CASE WHEN :sortOrder = 'album_date_added' THEN albums.date_added END DESC,

app/src/main/java/com/theveloper/pixelplay/data/database/PixelPlayDatabase.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase
3636
AiCacheEntity::class,
3737
AiUsageEntity::class
3838
],
39-
version = 40,
39+
version = 41,
4040
exportSchema = true
4141
)
4242
abstract class PixelPlayDatabase : RoomDatabase() {
@@ -625,6 +625,30 @@ abstract class PixelPlayDatabase : RoomDatabase() {
625625
}
626626
}
627627

628+
val MIGRATION_40_41 = object : Migration(40, 41) {
629+
override fun migrate(db: SupportSQLiteDatabase) {
630+
if ("album_artist" !in getTableColumns(db, "albums")) {
631+
db.execSQL("ALTER TABLE albums ADD COLUMN album_artist TEXT DEFAULT NULL")
632+
}
633+
db.execSQL(
634+
"""
635+
UPDATE albums
636+
SET album_artist = (
637+
SELECT s.album_artist
638+
FROM songs s
639+
WHERE s.album_id = albums.id
640+
AND s.album_artist IS NOT NULL
641+
AND TRIM(s.album_artist) != ''
642+
GROUP BY s.album_artist
643+
ORDER BY COUNT(*) DESC, LENGTH(s.album_artist) DESC
644+
LIMIT 1
645+
)
646+
""".trimIndent()
647+
)
648+
db.execSQL("CREATE INDEX IF NOT EXISTS index_albums_album_artist ON albums(album_artist)")
649+
}
650+
}
651+
628652
private fun ensureSongsTableHasDateAdded(db: SupportSQLiteDatabase) {
629653
if (!tableExists(db, "songs")) {
630654
recreateSongsTable(db)

app/src/main/java/com/theveloper/pixelplay/data/model/LibraryModels.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ data class Album(
1313
val year: Int,
1414
val dateAdded: Long,
1515
val albumArtUriString: String?,
16-
val songCount: Int
16+
val songCount: Int,
17+
val albumArtist: String? = null
1718
) : Parcelable {
1819
companion object {
1920
fun empty() = Album(
@@ -23,7 +24,8 @@ data class Album(
2324
dateAdded = 0,
2425
year = 0,
2526
albumArtUriString = null,
26-
songCount = 0
27+
songCount = 0,
28+
albumArtist = null
2729
)
2830
}
2931
}

app/src/main/java/com/theveloper/pixelplay/data/worker/SyncWorker.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,14 @@ constructor(
561561
artistDelimiters = artistDelimiters,
562562
wordDelimiters = wordDelimiters
563563
)
564+
val metadataAlbumArtist = songsInAlbum
565+
.mapNotNull { song ->
566+
song.albumArtist?.takeIf { it.isNotBlank() }
567+
}
568+
.groupingBy { it }
569+
.eachCount()
570+
.maxByOrNull { it.value }
571+
?.key
564572

565573
AlbumEntity(
566574
id = catAlbumId,
@@ -570,7 +578,8 @@ constructor(
570578
albumArtUriString = representativeAlbumArt,
571579
songCount = songsInAlbum.size,
572580
dateAdded = firstSong.dateAdded,
573-
year = firstSong.year
581+
year = firstSong.year,
582+
albumArtist = metadataAlbumArtist
574583
)
575584
}
576585

app/src/main/java/com/theveloper/pixelplay/di/AppModule.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ object AppModule {
163163
PixelPlayDatabase.MIGRATION_36_37,
164164
PixelPlayDatabase.MIGRATION_37_38,
165165
PixelPlayDatabase.MIGRATION_38_39,
166-
PixelPlayDatabase.MIGRATION_39_40
166+
PixelPlayDatabase.MIGRATION_39_40,
167+
PixelPlayDatabase.MIGRATION_40_41
167168
)
168169
.addCallback(PixelPlayDatabase.createRuntimeArtifactsCallback())
169170
.setJournalMode(RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING)

app/src/main/java/com/theveloper/pixelplay/presentation/components/SongInfoBottomSheet.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ fun SongInfoBottomSheet(
100100
onDeleteFromDevice: (activity: Activity, song: Song, onResult: (Boolean) -> Unit) -> Unit,
101101
onNavigateToAlbum: () -> Unit,
102102
onNavigateToArtist: () -> Unit,
103+
onNavigateToArtistById: (Long) -> Unit = { onNavigateToArtist() },
103104
onNavigateToGenre: () -> Unit,
104105
onEditSong: (
105106
title: String,
@@ -123,7 +124,9 @@ fun SongInfoBottomSheet(
123124
) {
124125
val context = LocalContext.current
125126
var showEditSheet by remember { mutableStateOf(false) }
127+
var showArtistPicker by remember { mutableStateOf(false) }
126128
val audioMeta by songInfoViewModel.audioMeta.collectAsStateWithLifecycle()
129+
val resolvedArtists by songInfoViewModel.resolvedArtists.collectAsStateWithLifecycle()
127130
val isPixelPlayWatchAvailable by songInfoViewModel.isPixelPlayWatchAvailable.collectAsStateWithLifecycle()
128131
val isWatchAvailabilityResolved by songInfoViewModel.isWatchAvailabilityResolved.collectAsStateWithLifecycle()
129132
val isSendingToWatch by songInfoViewModel.isSendingToWatch.collectAsStateWithLifecycle()
@@ -287,6 +290,7 @@ fun SongInfoBottomSheet(
287290

288291
LaunchedEffect(song.id) {
289292
songInfoViewModel.loadAudioMeta(song)
293+
songInfoViewModel.loadArtistsForSong(song)
290294
}
291295

292296
val pagerState = androidx.compose.foundation.pager.rememberPagerState(pageCount = { 2 })
@@ -706,7 +710,13 @@ fun SongInfoBottomSheet(
706710
icon = Icons.Rounded.Person,
707711
iconDescription = stringResource(R.string.cd_artist_icon),
708712
shape = infoSegmentItemShape,
709-
onClick = onNavigateToArtist,
713+
onClick = {
714+
if (song.artists.size > 1) {
715+
showArtistPicker = true
716+
} else {
717+
onNavigateToArtist()
718+
}
719+
},
710720
)
711721

712722
if (!audioMetaLabel.isNullOrEmpty()) {
@@ -835,6 +845,20 @@ fun SongInfoBottomSheet(
835845
showEditSheet = false
836846
},
837847
)
848+
849+
val artistPickerSheetState = androidx.compose.material3.rememberModalBottomSheetState(skipPartiallyExpanded = true)
850+
if (showArtistPicker && resolvedArtists.isNotEmpty()) {
851+
com.theveloper.pixelplay.presentation.components.player.PlayerArtistPickerBottomSheet(
852+
song = song,
853+
artists = resolvedArtists,
854+
sheetState = artistPickerSheetState,
855+
onDismiss = { showArtistPicker = false },
856+
onArtistClick = { artist ->
857+
showArtistPicker = false
858+
onNavigateToArtistById(artist.id)
859+
}
860+
)
861+
}
838862
}
839863

840864
@Composable

app/src/main/java/com/theveloper/pixelplay/presentation/components/subcomps/FetchLyricsDialog.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import androidx.compose.material.icons.rounded.SearchOff
2626
import androidx.compose.material3.Button
2727
import androidx.compose.material3.ButtonDefaults
2828
import androidx.compose.material3.CardDefaults
29-
import androidx.compose.material3.CircularProgressIndicator
29+
import androidx.compose.material3.CircularWavyProgressIndicator
3030
import androidx.compose.material3.ElevatedCard
3131
import androidx.compose.material3.Icon
3232
import androidx.compose.material3.MaterialTheme
@@ -290,10 +290,8 @@ private fun LoadingContent() {
290290
modifier = Modifier.padding(vertical = 48.dp),
291291
horizontalAlignment = Alignment.CenterHorizontally
292292
) {
293-
CircularProgressIndicator(
294-
modifier = Modifier.size(56.dp),
295-
strokeWidth = 4.dp,
296-
strokeCap = StrokeCap.Round
293+
CircularWavyProgressIndicator(
294+
modifier = Modifier.size(56.dp)
297295
)
298296
Spacer(modifier = Modifier.height(24.dp))
299297
Text(

0 commit comments

Comments
 (0)