diff --git a/app/src/main/java/xyz/cottongin/radio247/RadioApplication.kt b/app/src/main/java/xyz/cottongin/radio247/RadioApplication.kt index 665a5a0..be1e836 100644 --- a/app/src/main/java/xyz/cottongin/radio247/RadioApplication.kt +++ b/app/src/main/java/xyz/cottongin/radio247/RadioApplication.kt @@ -15,7 +15,7 @@ class RadioApplication : Application() { val database: RadioDatabase by lazy { Room.databaseBuilder(this, RadioDatabase::class.java, "radio_database") .addCallback(SomaFmSeedData) - .addMigrations(RadioDatabase.MIGRATION_1_2, RadioDatabase.MIGRATION_2_3, RadioDatabase.MIGRATION_3_4) + .addMigrations(RadioDatabase.MIGRATION_1_2, RadioDatabase.MIGRATION_2_3, RadioDatabase.MIGRATION_3_4, RadioDatabase.MIGRATION_4_5) .build() } diff --git a/app/src/main/java/xyz/cottongin/radio247/data/db/RadioDatabase.kt b/app/src/main/java/xyz/cottongin/radio247/data/db/RadioDatabase.kt index 3826dbc..e40dde0 100644 --- a/app/src/main/java/xyz/cottongin/radio247/data/db/RadioDatabase.kt +++ b/app/src/main/java/xyz/cottongin/radio247/data/db/RadioDatabase.kt @@ -9,6 +9,7 @@ import xyz.cottongin.radio247.data.model.ListeningSession import xyz.cottongin.radio247.data.model.MetadataSnapshot import xyz.cottongin.radio247.data.model.Playlist import xyz.cottongin.radio247.data.model.Station +import xyz.cottongin.radio247.data.model.StationPreference import xyz.cottongin.radio247.data.model.StationStream @Database( @@ -18,9 +19,10 @@ import xyz.cottongin.radio247.data.model.StationStream MetadataSnapshot::class, ListeningSession::class, ConnectionSpan::class, - StationStream::class + StationStream::class, + StationPreference::class ], - version = 4, + version = 5, exportSchema = true ) abstract class RadioDatabase : RoomDatabase() { @@ -30,6 +32,7 @@ abstract class RadioDatabase : RoomDatabase() { abstract fun listeningSessionDao(): ListeningSessionDao abstract fun connectionSpanDao(): ConnectionSpanDao abstract fun stationStreamDao(): StationStreamDao + abstract fun stationPreferenceDao(): StationPreferenceDao companion object { val MIGRATION_1_2 = object : Migration(1, 2) { @@ -63,5 +66,19 @@ abstract class RadioDatabase : RoomDatabase() { SomaFmSeedData.seedStreamsForExistingStations(db) } } + + val MIGRATION_4_5 = object : Migration(4, 5) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """CREATE TABLE IF NOT EXISTS station_preferences ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + stationId INTEGER NOT NULL, + qualityOverride TEXT DEFAULT NULL, + FOREIGN KEY(stationId) REFERENCES stations(id) ON DELETE CASCADE + )""" + ) + db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS index_station_preferences_stationId ON station_preferences(stationId)") + } + } } } diff --git a/app/src/main/java/xyz/cottongin/radio247/data/db/StationPreferenceDao.kt b/app/src/main/java/xyz/cottongin/radio247/data/db/StationPreferenceDao.kt new file mode 100644 index 0000000..aed2168 --- /dev/null +++ b/app/src/main/java/xyz/cottongin/radio247/data/db/StationPreferenceDao.kt @@ -0,0 +1,18 @@ +package xyz.cottongin.radio247.data.db + +import androidx.room.Dao +import androidx.room.Query +import androidx.room.Upsert +import xyz.cottongin.radio247.data.model.StationPreference + +@Dao +interface StationPreferenceDao { + @Query("SELECT * FROM station_preferences WHERE stationId = :stationId") + suspend fun getByStationId(stationId: Long): StationPreference? + + @Upsert + suspend fun upsert(pref: StationPreference) + + @Query("DELETE FROM station_preferences WHERE stationId = :stationId") + suspend fun deleteByStationId(stationId: Long) +} diff --git a/app/src/main/java/xyz/cottongin/radio247/data/model/StationPreference.kt b/app/src/main/java/xyz/cottongin/radio247/data/model/StationPreference.kt new file mode 100644 index 0000000..d3828c2 --- /dev/null +++ b/app/src/main/java/xyz/cottongin/radio247/data/model/StationPreference.kt @@ -0,0 +1,22 @@ +package xyz.cottongin.radio247.data.model + +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity( + tableName = "station_preferences", + foreignKeys = [ForeignKey( + entity = Station::class, + parentColumns = ["id"], + childColumns = ["stationId"], + onDelete = ForeignKey.CASCADE + )], + indices = [Index("stationId", unique = true)] +) +data class StationPreference( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val stationId: Long, + val qualityOverride: String? = null +)