Skip to content

Instantly share code, notes, and snippets.

View zach-klippenstein's full-sized avatar

Zach Klippenstein zach-klippenstein

View GitHub Profile
@zach-klippenstein
zach-klippenstein / TextFieldContentPaddingHack.kt
Created February 1, 2025 02:09
A little hack for adding content padding to your decoration boxes in Jetpack Compose's BasicTextField.
import androidx.compose.foundation.background
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.ui.Modifier
import androidx.compose.ui.Modifier.Node
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.Measurable
@file:Suppress(
"CANNOT_OVERRIDE_INVISIBLE_MEMBER",
"INVISIBLE_MEMBER",
"INVISIBLE_REFERENCE",
)
import androidx.collection.ObjectIntMap
import androidx.compose.runtime.DerivedState
import androidx.compose.runtime.DerivedStateObserver
import androidx.compose.runtime.SnapshotMutationPolicy
@zach-klippenstein
zach-klippenstein / CenterModifier.kt
Last active November 5, 2024 18:40
Some fake modifiers to teach Compose's centering idiom.
@file:Suppress("NOTHING_TO_INLINE", "UnusedReceiverParameter")
@file:SuppressLint("ModifierFactoryUnreferencedReceiver")
import android.annotation.SuppressLint
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.layout.wrapContentWidth
@zach-klippenstein
zach-klippenstein / ThrottledMutableState.kt
Created June 25, 2024 23:38
A sketch of a Compose MutableState object that only accepts writes that happen after a certain time after the previously-accepted write. Writes that happen too quickly are ignored. Inspired by https://x.com/pablisc0/status/1793599496305483881
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.SnapshotMutationPolicy
import androidx.compose.runtime.structuralEqualityPolicy
/**
* Returns a [MutableState] object that only accepts writes that happen [debounceMillis] after the
* previously-accepted write. Writes that happen less than [debounceMillis] after a previous write
* are ignored.
*
* Write times are determined using [System.currentTimeMillis].
@zach-klippenstein
zach-klippenstein / emulator-jank.sh
Last active January 11, 2024 22:19
Shell script to trigger some jank in the Android emulator.
#!/bin/bash
# Tells an Android emulator to take a snapshot of itself and then
# delete that snapshot immediately. The act of taking a snapshot
# forces the emulator to temporarily pause and trigger unexpected
# system behaviors. When it happens during a test run, it can
# trigger certain hard-to-reproduce flakes.
SNAPSHOT=__TEMPORARY_SNAPSHOT
AUTH="$(cat ~/.emulator_console_auth_token)"
PORT=$1
@Preview(showBackground = true, showSystemUi = true)
@Composable
fun App() {
Column {
MarxistRow {
Text("Left Text", Modifier.background(Color.Red))
Text("Right Text", Modifier.background(Color.Blue))
}
MarxistRow {
@zach-klippenstein
zach-klippenstein / CursedButtons.kt
Last active October 20, 2022 18:38
Code for twitter thread about why onClick handlers don't let you emit composables. https://twitter.com/zachklipp/status/1583165356322930688
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@zach-klippenstein
zach-klippenstein / ComicBookApp.kt
Created April 12, 2022 06:40
Demo app with a modifier that renders its node as comic book-style dots.
import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.Checkbox
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.*
@zach-klippenstein
zach-klippenstein / comic-book-shader.sksl
Last active April 12, 2022 06:09
SkSL shader program to render a comic-book style effect.
// Paste this code into shaders.skia.org
float tileSize = 12;
float dotMinDiameter = 9;
vec2 maxRedShift = vec2(-2, 3);
vec2 maxGreenShift = vec2(2.5, 0);
vec2 maxBlueShift = vec2(1, -2);
half3 baseColor = half3(0, 0, 0);
half4 main(vec2 fragcoord) {
fun Modifier.saturate(saturation: Float): Modifier =
drawWithCache {
// Cache the paint object so it can be reused between draw calls.
val contentPaint = Paint().apply {
colorFilter = ColorFilter.saturate(saturation)
}
onDrawWithContent {
drawIntoCanvas {
it.saveLayer(Rect(Offset.Zero, size), contentPaint)