Skip to content

Instantly share code, notes, and snippets.

View timrijckaert's full-sized avatar

Tim Rijckaert timrijckaert

View GitHub Profile
@timrijckaert
timrijckaert / GravitySnapHelper.java
Created October 4, 2016 21:51
A snap helper that has a notion of Gravity and will snap accordingly
package be.tim.rijckaert.snaprecyclerview;
import android.graphics.PointF;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.LinearSnapHelper;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.LayoutManager;
@timrijckaert
timrijckaert / AndroidManifest.xml
Last active May 2, 2020 19:32
Test rule that disables animations and softkeyboard before any test. Easy access function to control demo modus on API 23 and up devices
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="be.rijckaert.tim.disableanimations">
<!-- Place this permission in your debug folder -->
<uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>
</manifest>
@timrijckaert
timrijckaert / CreditCardFormattingTextWatcher.kt
Created January 23, 2021 17:59
Inserts spaces after every block of 4 digits
class CreditCardTextWatcher(private val maxLength: Int) : TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
val textLength = s.length
// first remove any previous span
val spans = s.getSpans(0, s.length, SpaceSpan::class.java)
for (i in spans.indices) {
@timrijckaert
timrijckaert / either.kt
Created February 18, 2021 17:27
Shameless copied from Arrow Core. However this is ideal to introduce your team to Either without making a big fuzz about adding a new lib with new paradigms.
//https://arrow-kt.io/docs/apidocs/arrow-core-data/arrow.core/-either/
sealed class Either<out A, out B> {
internal abstract val isRight: Boolean
internal abstract val isLeft: Boolean
fun isLeft(): Boolean = isLeft
package com.example.sample
import arrow.core.Either
import arrow.core.NonEmptyList
import arrow.core.computations.either
import arrow.core.flatMap
import arrow.core.nonEmptyListOf
import arrow.core.right
import arrow.core.traverseEither
import arrow.core.zip
@timrijckaert
timrijckaert / FlowPlaygroundTest.kt
Last active July 6, 2021 14:04
Use cases with Flow
interface FlowProvider {
fun returnsAColdFlow(): Flow<Int> = flow {
repeat(5) {
emit(it)
delay(100)
}
}
}
object DefaultFlowProvider : FlowProvider
@timrijckaert
timrijckaert / Cell.kt
Last active October 22, 2021 13:19
Similar to how Jetpack Compose's Modifier works, but for Cell NEBA
package com.bnpp.easybanking.zeplin.molecule
import androidx.annotation.StringRes
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextDecoration
import com.bnpp.easybanking.zeplin.molecule.CellData.Companion.DefaultMaxLines
import com.bnpp.easybanking.zeplin.molecule.CellData.Companion.DefaultTextDecoration
import com.bnpp.easybanking.zeplin.molecule.CellData.Companion.DefaultTextModifier
package com.bnppf.easybanking
import arrow.fx.coroutines.Schedule
import io.kotest.core.spec.style.StringSpec
import kotlin.time.Duration.Companion.seconds
import kotlin.time.ExperimentalTime
import kotlin.time.TimeMark
import kotlin.time.TimeSource
@OptIn(ExperimentalTime::class)
@timrijckaert
timrijckaert / commands-dump-place.md
Last active November 3, 2022 08:26
Some commands useful for debugging deeplinking

Check signature of an APK

keytool -printcert -jarfile file.apk

The SHA256 is the interesting one and need for the assetlink.json

Reverify assetlink

@timrijckaert
timrijckaert / image-comparator
Last active December 19, 2022 11:04
A simple Python script used for comparing two folders containing screenshots after an Espresso/Spoon run. One folder contains your base screenshots the other folder your newly screenshots. Use this as your last regression resort to see if Espresso overlooked something.
#!/usr/bin/python
import glob
import os
import sys
from subprocess import Popen, PIPE
# Script that will compare screenshots to a set of previous screenshots
# first arg: full path to base screenshots
# second arg: full path to spoon output dir