Skip to content

Instantly share code, notes, and snippets.

@hrules6872
hrules6872 / PhoneNumberVisualTransformation.kt
Created April 3, 2023 09:49
Compose PhoneNumber VisualTransformation implementation
class PhoneNumberVisualTransformation(countryCode: String) : SeparatorVisualTransformation() {
private val phoneNumberFormatter = PhoneNumberFormatter(countryCode)
override fun transform(input: CharSequence): CharSequence = phoneNumberFormatter.format(input.toString())
override fun isSeparator(char: Char): Boolean = !PhoneNumberUtils.isNonSeparator(char)
}
private class PhoneNumberFormatter(countryCode: String) {
private val formatter = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(countryCode)
fun format(number: String): String = number
@hrules6872
hrules6872 / ComposeStore.kt
Last active April 2, 2023 17:03
Zustand 🐻 implementation for Kotlin :) https://github.com/pmndrs/zustand
/*
* Copyright (c) 2022. Héctor de Isidro - hrules6872
*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
@hrules6872
hrules6872 / ComposeStore.kt
Last active February 22, 2023 09:49
Redux implementation for Kotlin :)
private val LocalStore: ProvidableCompositionLocal<Store<*>> = compositionLocalOf { error("Store not provided") }
@Composable
fun <STATE : State> StoreProvider(store: Store<STATE>, content: @Composable Store<STATE>.() -> Unit) {
CompositionLocalProvider(LocalStore provides store) {
store.content()
}
}
@Composable
@hrules6872
hrules6872 / ListPadExt.kt
Created February 22, 2023 07:21
Kotlin List.padStart and List.padEnd extensions
fun <TYPE> List<TYPE>.padEndOrCompact(size: Int, fallback: TYPE): List<TYPE> {
if (size < 0) throw IllegalArgumentException("Desired length $size is less than zero.")
return (0 until size).map { this.getOrNull(it) ?: fallback }
}
fun <TYPE> List<TYPE>.padEnd(size: Int, fallback: TYPE): List<TYPE> {
if (size < 0) throw IllegalArgumentException("Desired length $size is less than zero.")
return when {
size > this.size -> this.padEndOrCompact(size, fallback)
else -> this
@hrules6872
hrules6872 / demo-mode.sh
Last active January 31, 2023 16:34
Demo Mode for the Android System UI - screenshots - bash script
#!/usr/bin/env sh
# export PATH=$PATH:~/Library/Android/sdk/platform-tools/
case $1 in
"enter")
adb shell settings put global sysui_demo_allowed 1
# display time 12:00
adb shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm 1200
# display full mobile data without type
adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e level 4 -e datatype false
@hrules6872
hrules6872 / CircleView.kt
Created January 12, 2022 17:57
Circle View for Android in Kotlin
class CircleView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : View(context, attrs, defStyleAttr) {
private val paint by lazy { Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL } }
@ColorInt
var color: Int = Color.TRANSPARENT
set(value) {
field = value
invalidate()
}
@hrules6872
hrules6872 / KotlinExt.kt
Created October 2, 2022 13:15
Map It Please for Kotlin
/**
* Map it please. Returns a list containing the results of applying the
* given transform function to each element in the original collection.
*
* OP: https://twitter.com/jeranfox/status/1575133458631999488
*/
inline fun <TYPE, RESULT> Iterable<TYPE>.mip(transform: TYPE.() -> RESULT): List<RESULT> = map { it.transform() }
/** before:
* users.map { it.firstName }
@hrules6872
hrules6872 / SealedClassExt.kt
Last active September 22, 2022 16:01
safeOf(): returns the first subclass of a Sealed Class matching the given [predicate], or [default] if no such element was found / values(): list all subclasses (Kotlin)
fun <T : Any> KClass<T>.safeOf(default: T, predicate: (T) -> Boolean): T = this.values().find { predicate(it) } ?: default
fun <T : Any> KClass<T>.values(): List<T> {
if (!this.isSealed) throw IllegalCallerException("Receiver MUST be a Sealed class")
return this.sealedSubclasses.map { sealedSubclass ->
when {
sealedSubclass.objectInstance != null -> sealedSubclass.objectInstance!!
else -> try {
sealedSubclass.primaryConstructor?.callBy(mapOf()) ?: throw Exception()
} catch (ignored: Exception) {
@hrules6872
hrules6872 / TextViewDrawableSize.java
Last active September 8, 2022 12:22
TextViewDrawableSize - CompoundDrawable size
public class TextViewDrawableSize extends TextView {
private static final int DEFAULT_COMPOUND_DRAWABLE_SIZE = -1;
private int compoundDrawableWidth;
private int compoundDrawableHeight;
public TextViewDrawableSize(Context context) {
this(context, null);
}
public TextViewDrawableSize(Context context, AttributeSet attrs) {
@hrules6872
hrules6872 / obsidian-tables-horizontal-scrolling.css
Created August 22, 2022 15:59
Adds horizontal scrolling to tables in Obsidian Notes
/* Adds horizontal scrolling to tables in Obsidian Notes. Tested in Obsidian v0.15.9
See also: https://forum.obsidian.md/t/css-horizontal-scrolling-tables/26581/4
*/
/* in preview / read mode */
.markdown-preview-view table ,
.markdown-source-view table {
display: block; /* This is needed for scrollbar */
width: 100%;
max-width: -moz-max-content;