Skip to content

Instantly share code, notes, and snippets.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
fun <T> threadLocal(init: () -> T) = object : ReadWriteProperty<Any?, T> {
private val internal = object : ThreadLocal<T>() {
override fun initialValue() = init()
}
override fun getValue(thisRef: Any?, property: KProperty<*>): T = internal.get()!!
@green-nick
green-nick / SavedStateDelegate.kt
Last active March 20, 2021 20:51
WIP: Delegate which will automatically handle onSaveInstanceState/onRestoreInstanceState of property
package *
import android.util.*
import androidx.core.os.bundleOf
import androidx.savedstate.SavedStateRegistryOwner
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
inline fun <reified T : Any?> SavedStateRegistryOwner.savedState(initValue: T) =
object : ReadWriteProperty<SavedStateRegistryOwner, T> {
@green-nick
green-nick / ArgsExt.kt
Last active May 17, 2021 12:49
Bundle arguments delegates for Activites and Fragments
package *
import android.app.Activity
import androidx.fragment.app.Fragment
import kotlin.properties.ReadOnlyProperty
inline fun <reified T> argNamed() =
ReadOnlyProperty<Activity, T> { thisRef, prop ->
val data = thisRef.intent.extras?.get(prop.name)
data as T
@green-nick
green-nick / AndroidDebugLogger.kt
Created September 9, 2019 17:19
Release-free logger. Put these files in same packages in different flavours.
package %your.logger.package%
private const val MAX_TAG_LENGTH = 23
private const val INLINE_CALL_STACK_INDEX = 2
private val ANONYMOUS_CLASS = Pattern.compile("(\\$\\d+)+$")
inline fun log(message: () -> Any?) {
Log.d(inlineTag, message().toString())
}
@green-nick
green-nick / LocalizedString.kt
Last active April 1, 2021 20:32
Wrapper for strings without Android-dependency
package ...
private val identityMap: (String) -> String = { it }
sealed class LocalizedString
data class ResourceString(
val id: Int,
val quantity: Int? = null,
val args: List<Any> = emptyList(),
@green-nick
green-nick / ViewDelegates.kt
Last active December 1, 2020 16:04
Delegates for easier view init in Activities and Fragments
import android.app.Activity
import androidx.annotation.IdRes
import androidx.fragment.app.Fragment
import android.view.View
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
fun <V : View> Activity.view(@IdRes viewId: Int) = lazy<V>(LazyThreadSafetyMode.NONE) { findViewById(viewId) }
@green-nick
green-nick / ObservableList.kt
Last active August 16, 2019 08:20
Observable list
private open class MutableListWrapper<T>(private val source: MutableList<T>) : AbstractMutableList<T>() {
override val size get() = source.size
override fun add(index: Int, element: T) = source.add(index, element)
override fun get(index: Int) = source[index]
override fun removeAt(index: Int) = source.removeAt(index)
override fun set(index: Int, element: T) = source.set(index, element)
@green-nick
green-nick / Maybe.java
Last active January 24, 2019 14:55
Null safety wrapper for objects. Base on Monad pattern
package ;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class Maybe<T> {
private static final Maybe EMPTY = new Maybe();
private final T element;
private Maybe() {