Skip to content

Instantly share code, notes, and snippets.


Lucio Maciel luciofm

View GitHub Profile
luciofm / DebounceLiveData.kt
Created May 13, 2019
A Debouncing LiveData helper
View DebounceLiveData.kt
class DebounceLiveData<Source>(
private val source: LiveData<Source>,
private val debounceMs: Long
) : LiveData<Source>(), CoroutineScope {
private val job = SupervisorJob()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
private var debounceJob: Job? = null
private val observer = Observer<Source> { source ->
luciofm / batch.kt
Last active Nov 26, 2018
Batch actor with coroutines
View batch.kt
private inline fun <T> createBatchActor(context: CoroutineContext = CommonPool,
parent: Job? = null,
maxSize: Int = 100,
maxTime: Int = 500,
crossinline block: (List<T>) -> Unit): SendChannel<T> {
return actor(context, parent = parent) {
val batch = ArrayList<T>(maxSize)
var deadline = 0L // deadline for sending this batch to callback block
while(true) {
luciofm / ChatRoomsFragment.kt
Last active Jun 13, 2020
How to run LiveData transformations on a coroutine
View ChatRoomsFragment.kt
class ChatRoomsFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProviders.of(this, factory).get(
private fun subscribeUi() {
luciofm / AlphaSpan.kt
Created Apr 26, 2018
Animate alhpa of each character separately
View AlphaSpan.kt
package com.luciofm.playground
import android.text.TextPaint
class AlphaSpan(var alpha: Int) : CharacterStyle(), UpdateAppearance {
override fun updateDrawState(ds: TextPaint) {
ds.alpha = alpha
View FallbackSealedClass.kt
* Copyright 2018 Lucio Maciel, Rocket.Chat
* Copyright 2016 Serj Lotutovici
* 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
import java.nio.charset.Charset;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import okio.BufferedSource;
import okio.ByteString;
luciofm / build.gradle
Created Dec 2, 2015
Auto increment version number on release builds... You can change the build type on versionCode.gradle, you also will need to commit and push on your CI
View build.gradle
apply from: 'versionCode.gradle'
android {
defaultConfig {
versionName VERSION_NAME
versionCode Integer.parseInt(VERSION_CODE)
luciofm /
Created Nov 4, 2015 — forked from mttkay/
A simple Rx based pager
public class Pager<I, O> {
private static final Observable FINISH_SEQUENCE = Observable.never();
private PublishSubject<Observable<I>> pages;
private Observable<I> nextPage = finish();
private Subscription subscription = Subscriptions.empty();
private final PagingFunction<I> pagingFunction;
private final Func1<I, O> pageTransformer;
View twoway-view stacktrace
E Process: org.lucasr.twowayview.sample, PID: 7606
E java.lang.NullPointerException: Attempt to read from field 'int org.lucasr.twowayview.widget.TWSpannableGridLayoutManager$SpannableItemEntry.rowSpan' on a
null object reference
E at org.lucasr.twowayview.widget.TWSpannableGridLayoutManager$SpannableItemEntry.access$100(
E at org.lucasr.twowayview.widget.TWSpannableGridLayoutManager.getFirstChildCountInLanes(
E at org.lucasr.twowayview.widget.TWSpannableGridLayoutManager.moveLayoutToPosition(
E at org.lucasr.twowayview.widget.TWLanedLayoutManager.onLayoutChildren(
E at
E at
E at android.view.View.layout(
You can’t perform that action at this time.