Prepare release

This commit is contained in:
vfsfitvnm
2022-06-13 22:59:36 +02:00
parent 11f4621823
commit c78b3105b1
5 changed files with 318 additions and 107 deletions

View File

@@ -2,9 +2,8 @@ package it.vfsfitvnm.vimusic
import android.content.Context
import android.database.Cursor
import android.os.Parcel
import androidx.media3.common.MediaItem
import androidx.room.*
import androidx.room.migration.AutoMigrationSpec
import it.vfsfitvnm.vimusic.models.*
import kotlinx.coroutines.flow.Flow
@@ -84,15 +83,6 @@ interface Database {
@Insert(onConflict = OnConflictStrategy.ABORT)
fun insert(song: Song): Long
@Insert(onConflict = OnConflictStrategy.ABORT)
fun insertQueuedMediaItems(queuedMediaItems: List<QueuedMediaItem>)
@Query("SELECT * FROM QueuedMediaItem")
fun queuedMediaItems(): List<QueuedMediaItem>
@Query("DELETE FROM QueuedMediaItem")
fun clearQueuedMediaItems()
@Update
fun update(song: Song)
@@ -130,19 +120,18 @@ interface Database {
Info::class,
SongWithAuthors::class,
SearchQuery::class,
QueuedMediaItem::class
],
views = [
SortedSongInPlaylist::class
],
version = 3,
version = 4,
exportSchema = true,
autoMigrations = [
AutoMigration(from = 1, to = 2),
AutoMigration(from = 2, to = 3),
]
AutoMigration(from = 3, to = 4, spec = DatabaseInitializer.From3To4Migration::class),
],
)
@TypeConverters(Converters::class)
abstract class DatabaseInitializer protected constructor() : RoomDatabase() {
abstract val database: Database
@@ -158,37 +147,9 @@ abstract class DatabaseInitializer protected constructor() : RoomDatabase() {
}
}
}
}
@TypeConverters
object Converters {
// TODO: temporary
@TypeConverter
fun mediaItemFromByteArray(value: ByteArray?): MediaItem? {
return value?.let { byteArray ->
val parcel = Parcel.obtain()
parcel.unmarshall(byteArray, 0, byteArray.size)
parcel.setDataPosition(0)
val pb = parcel.readBundle(MediaItem::class.java.classLoader)
parcel.recycle()
pb?.let {
MediaItem.CREATOR.fromBundle(pb)
}
}
}
// TODO: temporary
@TypeConverter
fun mediaItemToByteArray(mediaItem: MediaItem?): ByteArray? {
return mediaItem?.toBundle()?.let { persistableBundle ->
val parcel = Parcel.obtain()
parcel.writeBundle(persistableBundle)
parcel.marshall().also {
parcel.recycle()
}
}
}
@DeleteTable.Entries(DeleteTable(tableName = "QueuedMediaItem"))
class From3To4Migration : AutoMigrationSpec
}
val Database.internal: RoomDatabase

View File

@@ -1,13 +0,0 @@
package it.vfsfitvnm.vimusic.models
import androidx.media3.common.MediaItem
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity
class QueuedMediaItem(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
@ColumnInfo(typeAffinity = ColumnInfo.BLOB) val mediaItem: MediaItem,
var position: Long?
)

View File

@@ -41,7 +41,6 @@ import com.google.common.util.concurrent.Futures
import com.google.common.util.concurrent.ListenableFuture
import it.vfsfitvnm.vimusic.*
import it.vfsfitvnm.vimusic.R
import it.vfsfitvnm.vimusic.models.QueuedMediaItem
import it.vfsfitvnm.vimusic.utils.*
import it.vfsfitvnm.youtubemusic.Outcome
import kotlinx.coroutines.*
@@ -123,55 +122,9 @@ class PlayerService : MediaSessionService(), MediaSession.MediaItemFiller,
.build()
player.addListener(this)
if (preferences.persistentQueue) {
coroutineScope.launch(Dispatchers.IO) {
val queuedMediaItems = Database.queuedMediaItems()
Database.clearQueuedMediaItems()
if (queuedMediaItems.isEmpty()) return@launch
val index = queuedMediaItems.indexOfFirst { it.position != null }.coerceAtLeast(0)
withContext(Dispatchers.Main) {
player.setMediaItems(
queuedMediaItems
.map(QueuedMediaItem::mediaItem)
.map { mediaItem ->
mediaItem.buildUpon()
.setUri(mediaItem.mediaId)
.setCustomCacheKey(mediaItem.mediaId)
.build()
},
true
)
player.seekTo(index, queuedMediaItems[index].position ?: 0)
player.playWhenReady = false
player.prepare()
}
}
}
}
override fun onDestroy() {
if (preferences.persistentQueue) {
val mediaItems = player.currentTimeline.mediaItems
val mediaItemIndex = player.currentMediaItemIndex
val mediaItemPosition = player.currentPosition
Database.internal.queryExecutor.execute {
Database.clearQueuedMediaItems()
Database.insertQueuedMediaItems(
mediaItems.mapIndexed { index, mediaItem ->
QueuedMediaItem(
mediaItem = mediaItem,
position = if (index == mediaItemIndex) mediaItemPosition else null
)
}
)
}
}
player.release()
mediaSession.release()
cache.release()

View File

@@ -78,8 +78,8 @@ fun NotificationSettingsScreen() {
}
SwitchSettingEntry(
title = "[SOON] Show Like button",
text = "Mark a song as favorite",
title = "Show Like button",
text = "Coming soon!",
isChecked = preferences.displayLikeButtonInNotification,
onCheckedChange = {
preferences.displayLikeButtonInNotification = it