From 5b0c9906f177783c308f5af54ec6ea448e04e2bb Mon Sep 17 00:00:00 2001 From: Nite Date: Thu, 24 Sep 2020 18:20:59 +0200 Subject: [PATCH] Fixed Server Id and Indexing --- .../activity/ServerSettingsModel.kt | 34 +++++++++++++++++-- .../moire/ultrasonic/data/ServerSettingDao.kt | 6 ++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/ServerSettingsModel.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/ServerSettingsModel.kt index 78df5476..95297be8 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/ServerSettingsModel.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/ServerSettingsModel.kt @@ -85,7 +85,10 @@ class ServerSettingsModel( */ fun getServerList(): LiveData> { viewModelScope.launch { - val dbServerList = repository.loadAllServerSettings().toMutableList() + var dbServerList = repository.loadAllServerSettings().toMutableList() + if (areIndexesMissing(dbServerList)) { + dbServerList = reindexSettings(dbServerList).toMutableList() + } dbServerList.add(0, ServerSetting(context.getString(R.string.main_offline), "")) serverList.value = dbServerList @@ -196,7 +199,7 @@ class ServerSettingsModel( viewModelScope.launch { serverSetting.index = (repository.count() ?: 0) + 1 - serverSetting.id = serverSetting.index + serverSetting.id = (repository.getMaxId() ?: 0) + 1 repository.insert(serverSetting) Log.d(TAG, "saveNewItem saved server setting: $serverSetting") } @@ -231,4 +234,31 @@ class ServerSettingsModel( settings.getString(PREFERENCES_KEY_MUSIC_FOLDER_ID + preferenceId, null) ) } + + /** + * Checks if there are any missing indexes in the ServerSetting list + * For displaying the Server Settings in a ListView, it is mandatory that their indexes + * are'nt missing. Ideally the indexes are continuous, but some circumstances (e.g. + * concurrency or migration errors) may get them out of order. + * This would make the List Adapter crash, so it is best to prepare and check the list. + */ + private fun areIndexesMissing(settings: List): Boolean { + for (i in 1 until settings.size + 1) { + if (!settings.any { s -> s.index == i }) return true + } + return false + } + + /** + * This function updates all the Server Settings in the DB so their indexing is continuous. + */ + private suspend fun reindexSettings(settings: List): List { + val sortedSettings = settings.sortedBy { t -> t.index } + for (i in sortedSettings.indices) { + sortedSettings[i].index = i + 1 + repository.update(sortedSettings[i]) + Log.d(TAG, "reindexSettings saved ${sortedSettings[i]}") + } + return sortedSettings + } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSettingDao.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSettingDao.kt index 65c365dd..27c289b3 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSettingDao.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSettingDao.kt @@ -54,4 +54,10 @@ interface ServerSettingDao { */ @Query("SELECT COUNT(*) FROM serverSetting") suspend fun count(): Int? + + /** + * Retrieves the greatest value of the Id column in the table + */ + @Query("SELECT MAX([id]) FROM serverSetting") + suspend fun getMaxId(): Int? }