Skip to content

Instantly share code, notes, and snippets.

@Nonda95
Nonda95 / Singleflight.kt
Created April 15, 2019 07:06
Kotlin Coroutines PoC of Go's singleflight
import kotlinx.coroutines.*
private val deferreds = mutableMapOf<String, Deferred<*>>()
@Suppress("UNCHECKED_CAST")
fun <T> doAsync(key: String, action: suspend () -> T): Deferred<T> {
val deferredResult = deferreds[key]?.takeIf { it.isActive }
?: GlobalScope.async { action() }.also { deferreds[key] = it }
return deferredResult as Deferred<T>
}
@Nonda95
Nonda95 / DetailActivity.kt
Created April 5, 2018 10:44
Reload image when transition ends
override fun onCreate(savedInstanceState: Bundle?) {
...
window.sharedElementEnterTransition = TransitionSet()
.addTransition(ChangeImageTransform())
.addTransition(ChangeBounds())
.apply {
doOnEnd { detailImage.load(url) }
}
}
@Nonda95
Nonda95 / DetailActivity.kt
Created April 5, 2018 10:42
Add loading image only from cache
override fun onCreate(savedInstanceState: Bundle?) {
...
detailImage.load(url, loadOnlyFromCache = true) {
supportStartPostponedEnterTransition()
}
}
@Nonda95
Nonda95 / GlideLoader.kt
Created April 5, 2018 10:39
Add don't transform option to Glide
fun ImageView.load(url: String, onLoadingFinished: () -> Unit = {}) {
...
val requestOptions = RequestOptions.placeholderOf(R.drawable.placeholder)
.dontTransform()
Glide.with(this)
.load(url)
.apply(requestOptions)
.listener(listener)
.into(this)
}
@Nonda95
Nonda95 / DetailActivity.kt
Created April 5, 2018 10:37
Postpone Shared Element Transition
override fun onCreate(savedInstanceState: Bundle?) {
...
supportPostponeEnterTransition()
detailImage.load(url) {
supportStartPostponedEnterTransition()
}
}
@Nonda95
Nonda95 / DetailActivity.kt
Created April 5, 2018 10:33
Set transition name
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail)
val url = intent.getStringExtra(IMAGE_URL_KEY)
detailImage.transitionName = url
detailImage.load(url)
}
@Nonda95
Nonda95 / MainActivity.kt
Created April 5, 2018 10:30
Start Activity with Shared Element Transition
fun goToDetails(url: String, imageView: View) {
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imageView, imageView.transitionName).toBundle()
Intent(this, DetailActivity::class.java)
.putExtra(IMAGE_URL_KEY, url)
.let {
startActivity(it, options)
}
}
@Nonda95
Nonda95 / GlideLoader.kt
Created April 5, 2018 10:27
ImageView loading extension
fun ImageView.load(url: String) {
Glide.with(this)
.load(url)
.apply(RequestOptions.placeholderOf(R.drawable.placeholder))
.into(this)
}