Skip to content

Instantly share code, notes, and snippets.

View cbeyls's full-sized avatar

Christophe Beyls cbeyls

View GitHub Profile
@cbeyls
cbeyls / FlowLayout.kt
Created September 17, 2020 00:30
FlowLayout implementation for Jetpack Compose
package be.digitalia.compose.layout
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Layout
import androidx.compose.ui.Modifier
@Composable
fun FlowLayout(
modifier: Modifier = Modifier,
@cbeyls
cbeyls / LayerCrossfadeTransition.kt
Last active August 1, 2020 02:32
A Transition for the Coil image loader that crossfades from the current drawable to a new one, and enables a hardware layer for the duration of the animation if the view is not opaque.
package be.digitalia.bifff.coil
import android.view.View
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
import coil.annotation.ExperimentalCoilApi
import coil.decode.DataSource
import coil.drawable.CrossfadeDrawable
import coil.request.ErrorResult
import coil.request.RequestResult
@cbeyls
cbeyls / TypedFragmentResults.kt
Created May 19, 2020 20:55
Example of type-safe Fragment result contract extensions
import android.os.Bundle
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentResultListener
import androidx.lifecycle.LifecycleOwner
interface FragmentResultContract<T> {
fun toBundle(result: T): Bundle
@cbeyls
cbeyls / RecyclerViewExt.kt
Last active February 8, 2024 19:17
Extension function to enforce a single scroll direction for a RecyclerView
package be.digitalia.samples.utils
import android.view.MotionEvent
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener
import kotlin.math.abs
fun RecyclerView.enforceSingleScrollDirection() {
val enforcer = SingleScrollDirectionEnforcer()
addOnItemTouchListener(enforcer)
@cbeyls
cbeyls / RecyclerViewUtils.java
Last active January 3, 2020 16:12
Utility class to enforce a single scroll direction for a RecyclerView or a ViewPager2
package be.digitalia.samples.utils;
import android.view.MotionEvent;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.widget.ViewPager2;
public class RecyclerViewUtils {
@cbeyls
cbeyls / BinaryTrees.kt
Created August 18, 2019 21:15
Kotlin implementation of the binary-trees benchmark from The Computer Language Benchmarks Game
/**
* The Computer Language Benchmarks Game
* https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
*
* based on Jarkko Miettinen's Java program
* contributed by Christophe Beyls
*/
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
@cbeyls
cbeyls / Parcelers.kt
Last active October 8, 2021 23:16
Kotlin Parcelize extensions
package be.digitalia.sample
import android.os.Parcel
import kotlinx.parcelize.Parceler
import java.math.BigDecimal
import java.math.BigInteger
import java.util.Date
inline fun <T> Parcel.readNullable(reader: () -> T) =
if (readInt() != 0) reader() else null
sealed class Animal {
// Cats are simple. A cat is a cat.
object Cat : Animal()
sealed class Dog : Animal() {
abstract val breed: String?
class DogWithBreed(override val breed: String) : Dog()
@cbeyls
cbeyls / LiveDataFactory.java
Created April 27, 2019 12:50
A Factory providing utility LiveData instances
package be.digitalia.common.livedata;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
import java.util.concurrent.TimeUnit;
@cbeyls
cbeyls / ComputableLiveData.java
Created March 11, 2018 14:01
A LiveData class that can be invalidated & computed on demand (based on an internal architecture components class)
package be.digitalia.arch.lifecycle;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MutableLiveData;
import android.os.AsyncTask;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.support.annotation.WorkerThread;