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 / ChipInput.kt
Last active January 25, 2022 00:21
Sketch of a possible chip input implementation
@Composable fun <C> ChipField(
chips: List<C>,
chipContent: @Composable (C) -> Unit.
modifier: Modifier = Modifier
) {
SelectionContainer(
allowCursor = true,
// some sort of callback or hoisted state for reading/mutating selection
modifier.textFieldFocusable()
) {
@zach-klippenstein
zach-klippenstein / Blockify.kt
Last active March 22, 2024 21:47
A Compose modifier to turn your apps into blocks (no, this has nothing to do with NFTs)
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.Spring
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.spring
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.detectDragGestures
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.integration.demos.BlockFilter.Companion.Lighting
@zach-klippenstein
zach-klippenstein / ContextConfigThemeWrapper.kt
Created May 13, 2021 20:09
Custom fork of ContextThemeWrapper that does some extra stuff to support overriding configurations better.
/**
* Fork of AppCompat ContextThemeWrapper (barely) to correctly support applying override
* configurations – all the features we don't need are dropped, it always extends the base context's
* theme, the theme can't be set explicitly, and it adds one critical piece of functionality: the new
* theme is [rebased][Theme.rebase] after being cloned from the base context's theme.
*/
open class ContextConfigThemeWrapper(
base: Context,
private val overrideConfiguration: Configuration
) : ContextWrapper(base) {
@zach-klippenstein
zach-klippenstein / SegmentedControl.kt
Last active December 26, 2024 23:13
iOS-style segmented control in Compose
import android.annotation.SuppressLint
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.awaitFirstDown
import androidx.compose.foundation.gestures.forEachGesture
import androidx.compose.foundation.gestures.horizontalDrag
import androidx.compose.foundation.layout.Arrangement.spacedBy
import androidx.compose.foundation.layout.Box
@zach-klippenstein
zach-klippenstein / DebugComposeBounds.kt
Last active June 26, 2022 01:38
Proof-of-concept of a composable that draws information about all its children on top of them.
@Composable fun App() {
DebugBounds {
Column(Modifier.background(Color.White).fillMaxSize()) {
BasicText("Some text")
Spacer(Modifier.size(10.dp))
BasicText("More text")
Spacer(Modifier.size(5.dp))
BasicText("Button", Modifier
.clickable { }
.background(Color.Blue, RoundedCornerShape(3.dp))
@zach-klippenstein
zach-klippenstein / ComposableDumper.kt
Last active September 6, 2024 20:48
Simple utility to dump the current Composition tree to logcat.
import android.util.Log
import androidx.compose.runtime.Composable
import androidx.compose.runtime.currentComposer
import androidx.compose.runtime.remember
import androidx.compose.ui.unit.IntBounds
import androidx.ui.tooling.CallGroup
import androidx.ui.tooling.Group
import androidx.ui.tooling.NodeGroup
import androidx.ui.tooling.asTree
@zach-klippenstein
zach-klippenstein / DrawLayerDemo.kt
Last active October 21, 2021 10:59
Interactive demo of the drawLayer composable function. (screencap in comments)
import androidx.animation.PhysicsBuilder
import androidx.animation.Spring.DampingRatioHighBouncy
import androidx.animation.Spring.StiffnessLow
import androidx.compose.Composable
import androidx.compose.Model
import androidx.compose.remember
import androidx.ui.animation.animate
import androidx.ui.core.DrawClipToBounds
import androidx.ui.core.Text
import androidx.ui.core.drawLayer
interface Host {
suspend fun getMovies(): List<Movies>
suspend fun setWatched(movie: Movie): Boolean
close()
}
class HostImpl(
// You could have a different WorkerPool for each system you need to talk to
// that has its own throttling requirements.
private val workerPool: WorkerPool
@zach-klippenstein
zach-klippenstein / DatabaseWorkerPool.kt
Created October 24, 2018 16:19
Sketch of what a worker pool for limiting concurrent database operations might look like.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.coroutineContext
class DatabaseExecutor(
nWorkers: Int,
context: CoroutineContext
) {