Create extension for androidx.collection.LruCache

This commit is contained in:
Benoit Marty 2020-12-03 18:52:35 +01:00 committed by Benoit Marty
parent be20f9b455
commit a36d5684b8
2 changed files with 26 additions and 6 deletions

View file

@ -22,6 +22,7 @@ import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.media.MediaService import org.matrix.android.sdk.api.session.media.MediaService
import org.matrix.android.sdk.api.session.media.PreviewUrlData import org.matrix.android.sdk.api.session.media.PreviewUrlData
import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.api.util.JsonDict
import org.matrix.android.sdk.internal.util.getOrPut
import javax.inject.Inject import javax.inject.Inject
internal class DefaultMediaService @Inject constructor( internal class DefaultMediaService @Inject constructor(
@ -34,12 +35,7 @@ internal class DefaultMediaService @Inject constructor(
private val extractedUrlsCache = LruCache<String, List<String>>(1_000) private val extractedUrlsCache = LruCache<String, List<String>>(1_000)
override fun extractUrls(event: Event): List<String> { override fun extractUrls(event: Event): List<String> {
val cacheKey = event.cacheKey() return extractedUrlsCache.getOrPut(event.cacheKey()) { urlsExtractor.extract(event) }
return extractedUrlsCache.get(cacheKey)
?: let {
urlsExtractor.extract(event)
.also { extractedUrlsCache.put(cacheKey, it) }
}
} }
private fun Event.cacheKey() = "${eventId ?: ""}-${roomId ?: ""}" private fun Event.cacheKey() = "${eventId ?: ""}-${roomId ?: ""}"

View file

@ -0,0 +1,24 @@
/*
* Copyright 2020 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 androidx.collection.LruCache
@Suppress("NULLABLE_TYPE_PARAMETER_AGAINST_NOT_NULL_TYPE_PARAMETER")
internal inline fun <K, V> LruCache<K, V>.getOrPut(key: K, defaultValue: () -> V): V {
return get(key) ?: defaultValue().also { put(key, it) }
}