Skip to content

Instantly share code, notes, and snippets.

View ElianFabian's full-sized avatar

Elián Fabián ElianFabian

View GitHub Profile
// Validation functions that returns a lists of error messages as UiText.
private const val ValidPasswordSpecialCharacters = "!?\$&#._-"
private const val ValidUsernameSpecialCharacters = "$&._-"
private const val MinDigitCount = 1
private const val MinSpecialCharacterCount = 1
private const val MinPasswordLength = 8
private const val MaxPasswordLength = 25
private const val MinUsernameLength = 2
private const val MaxUsernameLength = 25
@ElianFabian
ElianFabian / ViewScope.kt
Created October 9, 2023 16:47
A scope to launch coroutines in views.
import android.view.View
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.findViewTreeLifecycleOwner
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
@ElianFabian
ElianFabian / MainActivity.kt
Last active April 29, 2024 21:56
An interface that allows to work with Fragment arguments and events in a type-safe and process-death-safe way using extension functions.
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
@ElianFabian
ElianFabian / AnimationFlowExt.kt
Created October 11, 2023 20:26
Several flow operators to animate kotlin flows in Android.
@file:Suppress("NOTHING_TO_INLINE")
import android.animation.ArgbEvaluator
import android.animation.TimeInterpolator
import android.animation.TypeEvaluator
import android.animation.ValueAnimator
import android.view.animation.LinearInterpolator
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
@ElianFabian
ElianFabian / RecyclervViewExt.kt
Last active May 12, 2024 18:37
Several View extension functions.
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.distinctUntilChanged
fun <K : Any> RecyclerView.itemVisibilityFlow(
itemKey: K,
getItemKey: (position: Int) -> K?,
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.ListAdapter
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.reflect.full.allSuperclasses
suspend fun <T : Any> ListAdapter<T, *>.awaitCurrentListChanged(
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.AsyncListDiffer.ListListener
import androidx.recyclerview.widget.DiffUtil
import androidx.viewpager2.adapter.FragmentStateAdapter
abstract class FragmentStateListAdapter<T>(
@ElianFabian
ElianFabian / ActivityForResultExtentions.kt
Last active May 9, 2024 17:48
Activity Result extension functions to directly get the result from a suspending function or a callback in the call site.
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContract
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch
@ElianFabian
ElianFabian / ExtendedListAdapter.kt
Last active April 8, 2024 15:40
RecyclerView adapter utils
import androidx.recyclerview.widget.AdapterListUpdateCallback
import androidx.recyclerview.widget.AsyncDifferConfig
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.AsyncListDiffer.ListListener
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
abstract class ExtendedListAdapter<T, VH : RecyclerView.ViewHolder> : RecyclerView.Adapter<VH> {
val currentList: List<T> get() = _differ.currentList
@ElianFabian
ElianFabian / Example.kt
Last active December 10, 2023 22:17
A basic example of dependency injection with reflection in Kotlin.
import kotlin.reflect.KClass
fun main() {
val baseDependencies = listOf(
Gun(bullets = 50),
Hammer(power = 100),
)
val dependencyClasses = listOf(
Hero::class,