diff --git a/changelog.d/6392.misc b/changelog.d/6392.misc new file mode 100644 index 0000000000..c7b95917c3 --- /dev/null +++ b/changelog.d/6392.misc @@ -0,0 +1 @@ +Ensure `RealmList.clearWith()` extension is correctly used. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/extensions/RealmExtensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/extensions/RealmExtensions.kt index 00cbe0aa85..c6ea2bc7bd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/extensions/RealmExtensions.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/extensions/RealmExtensions.kt @@ -20,6 +20,7 @@ import io.realm.RealmList import io.realm.RealmObject import io.realm.RealmObjectSchema import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntityFields +import org.matrix.android.sdk.internal.util.fatalError internal fun RealmObject.assertIsManaged() { check(isManaged) { "${javaClass.simpleName} entity should be managed to use this function" } @@ -27,10 +28,19 @@ internal fun RealmObject.assertIsManaged() { /** * Clear a RealmList by deleting all its items calling the provided lambda. + * The lambda is supposed to delete the item, which means that after this operation, the list will be empty. */ internal fun RealmList.clearWith(delete: (T) -> Unit) { - while (!isEmpty()) { - first()?.let { delete.invoke(it) } + map { item -> + // Create a lambda for all items of the list + { delete(item) } + }.forEach { lambda -> + // Then invoke all the lambda + lambda.invoke() + } + + if (isNotEmpty()) { + fatalError("`clearWith` MUST delete all elements of the RealmList") } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/fatal.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/fatal.kt new file mode 100644 index 0000000000..323eee0b1c --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/fatal.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2022 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.internal.util + +import org.matrix.android.sdk.BuildConfig +import timber.log.Timber + +/** + * Throws in debug, only log in production. + * As this method does not always throw, next statement should be a return. +*/ +internal fun fatalError(message: String) { + if (BuildConfig.DEBUG) { + error(message) + } else { + Timber.e(message) + } +}