Skip to content

Instantly share code, notes, and snippets.

View ElianFabian's full-sized avatar

Elián Fabián ElianFabian

View GitHub Profile
@ElianFabian
ElianFabian / build.gradle.kts
Last active July 20, 2024 12:58
Snippet to add constants in BuildConfig for default language and supported languages dynamically based on values-* folders. Based on: https://gist.github.com/bleeding182/a7664adbbf087ff0a58967e332a8ed14
import java.util.Locale
// [...]
android {
defaultConfig {
// [...]
val defaultLocale = Locale("en")
val appLocales = getAppLocales(defaultLocale)
@ElianFabian
ElianFabian / ResourceHelper.kt
Last active March 30, 2024 19:26
Class to access resources inside ViewModels without worrying about Context.
import android.graphics.drawable.Drawable
import android.os.Build
import androidx.annotation.ArrayRes
import androidx.annotation.BoolRes
import androidx.annotation.ColorRes
import androidx.annotation.DimenRes
import androidx.annotation.DrawableRes
import androidx.annotation.IntegerRes
import androidx.annotation.PluralsRes
import androidx.annotation.RequiresApi
@ElianFabian
ElianFabian / SimplePreciseTimer.kt
Created January 8, 2024 17:10
An implementation of an easy-to-use precise timer.
// Based on: https://stackoverflow.com/questions/23323823/android-countdowntimer-tick-is-not-accurate
abstract class SimplePreciseTimer @JvmOverloads constructor(
periodInMillis: Long = 1,
) : java.util.Timer(true) {
private var task = newTask()
private var hasStarted = false
private var isRunning = false
var periodInMillis = periodInMillis
fun getAllDivisiblePairsInRangeCount(
start: Int,
end: Int,
ignoreSelfDivision: Boolean = false,
): Int {
require(start != 0) {
"start parameter can't be $start"
}
require(start <= end) {
"start '$start' must be less or equal to end '$end'"
@ElianFabian
ElianFabian / ImageAndAscii.psm1
Last active March 5, 2024 00:20
Functions to convert an image into a ASCII text and vicerversa (only works for Windows).
function Convert-ImageToAscii(
[Parameter(ParameterSetName = "A")]
[string] $Path,
[Parameter(ParameterSetName = "B")]
[System.Drawing.Bitmap] $Image,
[switch] $UseAlpha
) {
$bitMap = if ($Path) {
[System.Drawing.Bitmap]::FromFile((Resolve-Path $Path))
}
@ElianFabian
ElianFabian / build.gradle.kts
Created April 1, 2024 20:34
How to read a property from local.properties file.
android {
namespace = ""
compileSdk = 34
defaultConfig {
applicationId = ""
minSdk = 21
targetSdk = 34
versionCode = 1
versionName = "1.0"
import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.Observer
@ElianFabian
ElianFabian / ScrollViewExt.kt
Last active August 28, 2024 13:30
TextView extension functions to easily implement reactivity.
import android.view.View
import android.widget.ScrollView
fun ScrollView.smoothScrollToViewBottom(view: View) {
val scrollViewHeight = height
val outViewPosition = IntArray(2)
view.getLocationOnScreen(outViewPosition)
val viewY = outViewPosition[1]
@ElianFabian
ElianFabian / AsyncResource.kt
Last active September 30, 2024 19:26
Network utilities for Android.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.sync.*
interface AsyncResource<out T> {
sealed interface State<out T> {
data object NotStarted : State<Nothing>
data class Loading<out T>(val currentResource: Completed<T>?) : State<T>
sealed interface Completed<out T> : State<T> {
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.ViewGroup
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import androidx.annotation.DimenRes
import androidx.annotation.Dimension
import androidx.annotation.Px
import androidx.core.content.ContextCompat