From 4798ae32ba642e6c93bdd37bbef39928d601d3a1 Mon Sep 17 00:00:00 2001 From: KremeCN <3265494849@qq.com> Date: Wed, 26 Aug 2026 19:49:39 +0800 Subject: [PATCH] feat: preserve infrared ownership in schema --- .../infrared/data/local/InfraredDatabase.kt | 2 +- .../infrared/data/local/InfraredEntities.kt | 6 ++++++ .../infrared/data/local/InfraredMigrations.kt | 20 +++++++++++++++++++ .../data/local/RoomVirtualRemoteRepository.kt | 2 ++ .../infrared/di/InfraredFeatureModule.kt | 3 ++- .../domain/infrared/AddVirtualRemoteKey.kt | 1 + .../domain/infrared/CreateVirtualRemote.kt | 2 ++ .../domain/infrared/VirtualRemoteModels.kt | 1 + 8 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredMigrations.kt diff --git a/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredDatabase.kt b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredDatabase.kt index af179fd..31a2ec3 100644 --- a/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredDatabase.kt +++ b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredDatabase.kt @@ -10,7 +10,7 @@ import androidx.room.RoomDatabase VirtualRemoteEntity::class, RemoteKeyBindingEntity::class, ], - version = 2, + version = 3, exportSchema = false, ) abstract class InfraredDatabase : RoomDatabase() { diff --git a/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredEntities.kt b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredEntities.kt index 73112e5..aa0e857 100644 --- a/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredEntities.kt +++ b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredEntities.kt @@ -65,6 +65,11 @@ data class VirtualRemoteEntity( indices = [ Index(value = ["remoteId"]), Index(value = ["profileId"]), + Index( + value = ["profileId", "hardwareDeviceName", "assignedSlot"], + unique = true, + name = "index_remote_key_bindings_hardware_slot", + ), ], ) data class RemoteKeyBindingEntity( @@ -72,6 +77,7 @@ data class RemoteKeyBindingEntity( val id: String, val remoteId: String, val profileId: String, + val hardwareDeviceName: String, val buttonId: String, val displayName: String, val assignedSlot: String?, diff --git a/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredMigrations.kt b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredMigrations.kt new file mode 100644 index 0000000..92e543e --- /dev/null +++ b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/InfraredMigrations.kt @@ -0,0 +1,20 @@ +package com.flagship.abox.manager.infrared.data.local + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +val MIGRATION_2_3 = object : Migration(2, 3) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + "ALTER TABLE remote_key_bindings ADD COLUMN hardwareDeviceName TEXT NOT NULL DEFAULT ''", + ) + db.execSQL( + "UPDATE remote_key_bindings SET hardwareDeviceName = " + + "(SELECT deviceName FROM virtual_remotes WHERE virtual_remotes.id = remote_key_bindings.remoteId)", + ) + db.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS index_remote_key_bindings_hardware_slot " + + "ON remote_key_bindings(profileId, hardwareDeviceName, assignedSlot)", + ) + } +} diff --git a/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/RoomVirtualRemoteRepository.kt b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/RoomVirtualRemoteRepository.kt index 712e679..1a40b17 100644 --- a/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/RoomVirtualRemoteRepository.kt +++ b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/data/local/RoomVirtualRemoteRepository.kt @@ -206,6 +206,7 @@ private fun RemoteKeyBindingEntity.toDomain(): RemoteKeyBinding = RemoteKeyBindi id = id, remoteId = VirtualRemoteId(remoteId), profileId = ProviderProfileId(profileId), + hardwareDeviceName = DeviceName(hardwareDeviceName), buttonId = buttonId, displayName = displayName, assignedSlot = assignedSlot, @@ -219,6 +220,7 @@ private fun RemoteKeyBinding.toEntity(): RemoteKeyBindingEntity = RemoteKeyBindi id = id, remoteId = remoteId.value, profileId = profileId.value, + hardwareDeviceName = hardwareDeviceName.value, buttonId = buttonId, displayName = displayName, assignedSlot = assignedSlot, diff --git a/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/di/InfraredFeatureModule.kt b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/di/InfraredFeatureModule.kt index 13d499a..00c4b6f 100644 --- a/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/di/InfraredFeatureModule.kt +++ b/android/feature/infrared/src/main/kotlin/com/flagship/abox/manager/infrared/di/InfraredFeatureModule.kt @@ -20,6 +20,7 @@ import com.flagship.abox.manager.infrared.data.local.InfraredDao import com.flagship.abox.manager.infrared.data.local.InfraredDatabase import com.flagship.abox.manager.infrared.data.local.RoomInfraredKeyRepository import com.flagship.abox.manager.infrared.data.local.RoomVirtualRemoteRepository +import com.flagship.abox.manager.infrared.data.local.MIGRATION_2_3 import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -49,7 +50,7 @@ object InfraredFeatureModule { context, InfraredDatabase::class.java, "abox_infrared.db", - ).fallbackToDestructiveMigration().build() + ).addMigrations(MIGRATION_2_3).build() } @Provides diff --git a/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/AddVirtualRemoteKey.kt b/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/AddVirtualRemoteKey.kt index 9e5d46d..95a89c2 100644 --- a/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/AddVirtualRemoteKey.kt +++ b/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/AddVirtualRemoteKey.kt @@ -39,6 +39,7 @@ class AddVirtualRemoteKey( id = UUID.randomUUID().toString(), remoteId = remoteId, profileId = profileId, + hardwareDeviceName = remote.deviceName, buttonId = buttonId, displayName = trimmed, assignedSlot = assignedSlot, diff --git a/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/CreateVirtualRemote.kt b/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/CreateVirtualRemote.kt index cc2f747..c4c333d 100644 --- a/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/CreateVirtualRemote.kt +++ b/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/CreateVirtualRemote.kt @@ -64,6 +64,7 @@ class CreateVirtualRemote( id = UUID.randomUUID().toString(), remoteId = remoteId, profileId = profileId, + hardwareDeviceName = deviceName, buttonId = template.buttonId, displayName = template.displayName, assignedSlot = (index + 1).toString(), @@ -77,6 +78,7 @@ class CreateVirtualRemote( id = UUID.randomUUID().toString(), remoteId = remoteId, profileId = profileId, + hardwareDeviceName = deviceName, buttonId = template.buttonId, displayName = template.displayName, assignedSlot = null, diff --git a/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/VirtualRemoteModels.kt b/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/VirtualRemoteModels.kt index 112a29c..4d34693 100644 --- a/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/VirtualRemoteModels.kt +++ b/domain/src/main/kotlin/com/flagship/abox/manager/domain/infrared/VirtualRemoteModels.kt @@ -80,6 +80,7 @@ data class RemoteKeyBinding( val id: String, val remoteId: VirtualRemoteId, val profileId: ProviderProfileId, + val hardwareDeviceName: DeviceName = DeviceName(""), val buttonId: String, val displayName: String, val assignedSlot: String? = null,