Remember library/collection sorting (#150)

Closes #148 
Closes #83

Remember the chosen sort order & direction per user profile on device.
Also adds a few more sort options.

This is only saved on the device and not saved/loaded from the server.
This commit is contained in:
damontecres 2025-11-03 12:15:41 -05:00 committed by GitHub
parent 08577b8a31
commit 40267be633
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 486 additions and 51 deletions

View file

@ -10,17 +10,21 @@ import androidx.sqlite.db.SupportSQLiteDatabase
import com.github.damontecres.wholphin.data.model.ItemPlayback
import com.github.damontecres.wholphin.data.model.JellyfinServer
import com.github.damontecres.wholphin.data.model.JellyfinUser
import com.github.damontecres.wholphin.data.model.LibraryDisplayInfo
import com.github.damontecres.wholphin.data.model.NavDrawerPinnedItem
import org.jellyfin.sdk.model.api.ItemSortBy
import org.jellyfin.sdk.model.api.SortOrder
import org.jellyfin.sdk.model.serializer.toUUID
import java.util.UUID
@Database(
entities = [JellyfinServer::class, JellyfinUser::class, ItemPlayback::class, NavDrawerPinnedItem::class],
version = 5,
entities = [JellyfinServer::class, JellyfinUser::class, ItemPlayback::class, NavDrawerPinnedItem::class, LibraryDisplayInfo::class],
version = 6,
exportSchema = true,
autoMigrations = [
AutoMigration(3, 4),
AutoMigration(4, 5),
AutoMigration(5, 6),
],
)
@TypeConverters(Converters::class)
@ -30,6 +34,8 @@ abstract class AppDatabase : RoomDatabase() {
abstract fun itemPlaybackDao(): ItemPlaybackDao
abstract fun serverPreferencesDao(): ServerPreferencesDao
abstract fun libraryDisplayInfoDao(): LibraryDisplayInfoDao
}
class Converters {
@ -38,6 +44,18 @@ class Converters {
@TypeConverter
fun convertToUUID(str: String): UUID = str.toUUID()
@TypeConverter
fun convertItemSortBy(sort: ItemSortBy): String = sort.serialName
@TypeConverter
fun convertItemSortBy(sort: String): ItemSortBy? = ItemSortBy.fromNameOrNull(sort)
@TypeConverter
fun convertSortOrder(sort: SortOrder): String = sort.serialName
@TypeConverter
fun convertSortOrder(sort: String): SortOrder? = SortOrder.fromNameOrNull(sort)
}
object Migrations {

View file

@ -0,0 +1,29 @@
package com.github.damontecres.wholphin.data
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.github.damontecres.wholphin.data.model.JellyfinUser
import com.github.damontecres.wholphin.data.model.LibraryDisplayInfo
import java.util.UUID
@Dao
interface LibraryDisplayInfoDao {
fun getItem(
user: JellyfinUser,
itemId: UUID,
): LibraryDisplayInfo? = getItem(user.rowId, itemId)
@Query("SELECT * from LibraryDisplayInfo WHERE userId=:userId AND itemId=:itemId")
fun getItem(
userId: Int,
itemId: UUID,
): LibraryDisplayInfo?
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun saveItem(item: LibraryDisplayInfo): Long
@Query("SELECT * from LibraryDisplayInfo WHERE userId=:userId")
fun getItems(userId: Int): List<LibraryDisplayInfo>
}

View file

@ -0,0 +1,40 @@
@file:UseSerializers(UUIDSerializer::class)
package com.github.damontecres.wholphin.data.model
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.Ignore
import androidx.room.Index
import com.github.damontecres.wholphin.ui.data.SortAndDirection
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.UseSerializers
import org.jellyfin.sdk.model.api.ItemSortBy
import org.jellyfin.sdk.model.api.SortOrder
import org.jellyfin.sdk.model.serializer.UUIDSerializer
import java.util.UUID
@Entity(
foreignKeys = [
ForeignKey(
entity = JellyfinUser::class,
parentColumns = arrayOf("rowId"),
childColumns = arrayOf("userId"),
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE,
),
],
primaryKeys = ["userId", "itemId"],
indices = [Index("userId", "itemId", unique = true)],
)
@Serializable
data class LibraryDisplayInfo(
val userId: Int,
val itemId: UUID,
val sort: ItemSortBy,
val direction: SortOrder,
) {
@Ignore @Transient
val sortAndDirection = SortAndDirection(sort, direction)
}