Skip to content

Instantly share code, notes, and snippets.

View Nilzor's full-sized avatar

Frode Nilsen Nilzor

  • Forse.no
  • Oslo, Norway
View GitHub Profile
@Nilzor
Nilzor / task.gradle
Last active August 5, 2025 07:18
Gradle task to generate a PUML dependency graph of android gradle modules.
tasks.register("exportFullDependencyGraphAsPlantUml") {
group = "reporting"
description = "Generates a full transitive dependency graph as PlantUML"
doLast {
val configName = "${variant}RuntimeClasspath"
val configList = configurations.toList()
val config = configurations.findByName(configName)
?: configurations.findByName("qaDebugRuntimeClasspath") // <- Modify this per project
?: throw GradleException("Configuration '$configName' not found in project ${project.name}")
val output = File("$buildDir/reports/local-project-dependencies-$variant.puml")
@Nilzor
Nilzor / UsefulBindingAdapters.kt
Last active August 29, 2022 19:22
Useful binding adapters
object GeneralBindingAdapters {
/**
* To allow binding image resource Int in addition to Drawable.
* Saves you from depending on Resouces in the ViewModel,
*/
@JvmStatic
@BindingAdapter("android:src")
fun setImageResource(imageView: ImageView, resource: Int) {
imageView.setImageResource(resource)
@Nilzor
Nilzor / build.gradle
Created June 19, 2021 06:20
Temp build.gradle matrix plugin
buildscript {
repositories {
mavenCentral()
jcenter()
}
}
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.5.10'
id 'org.jetbrains.intellij' version '1.0'
@Nilzor
Nilzor / attempt_onclick.kt
Created June 16, 2021 13:58
Attempt at bindingconverter
@BindingConversion
@JvmStatic
fun konverto1(action: (() -> Unit)?) : View.OnClickListener? {
return View.OnClickListener { action?.invoke() }
}
@Nilzor
Nilzor / ContentTypeInterceptor.kt
Last active June 19, 2020 12:02
An OkHttp interceptor allowing you to override Content-Type for POST, PUT and PATCH requests
/**
* Overrides the HTTP Header Content-Type for POST, PATCH and PUT calls to the given [contentType]
*/
class ContentTypeInterceptor(private val contentType: String) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val chainBuilder = request.newBuilder()
request.body()?.let {
val newBody = ForwardingRequestbody(it, contentType)
when (request.method()) {
@Nilzor
Nilzor / ToothpickTest.kt
Created June 3, 2020 19:03
Toothpick overriding and stuff
package no.ruter.sales.utils
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.core.IsInstanceOf
import org.junit.Test
import toothpick.Scope
import toothpick.Toothpick
import toothpick.config.Module
import toothpick.ktp.binding.bind
import toothpick.ktp.binding.module
@Nilzor
Nilzor / databinderror.txt
Last active May 17, 2020 05:12
Databind error
import com.myapp.shared.databinding.FragmentSaleProductBindingImpl;
^
symbol: class FragmentSaleProductBindingImpl
^
warning Binding adapter AK(android.widget.ImageView, com.myapp.shared.model.viewmodel.overview.ConnectivityState) already exists for connectivityState! Overriding com.myapp.shared.bindingadapters.ValidatorBindingAdapter.Companion#setIdleCardImage with com.myapp.shared.bindingadapters.ValidatorBindingAdapter#setIdleCardImage
warning Binding adapter AK(android.widget.ImageView, com.myapp.shared.model.viewmodel.overview.ConnectivityState) already exists for connectivityState! Overriding com.myapp.shared.bindingadapters.ValidatorBindingAdapter.Companion#setIdleCardImage with com.myapp.shared.bindingadapters.ValidatorBindingAdapter#setIdleCardImage
warning Binding adapter AK(android.widget.TextView, com.myapp.shared.model.viewmodel.overview.ConnectivityState) already exists for connectivityState! Overriding com.myapp.shared.bindingadapters.ValidatorBin
@Nilzor
Nilzor / BuyTicketButton.kt
Created April 23, 2020 06:14
DAtabinding to custom prop
class BuyTicketButton(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) {
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : this(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs)
init {
val view = LayoutInflater.from(context)!!.inflate(R.layout.button_ticket, this, true)
val attributes = context.obtainStyledAttributes(attrs, R.styleable.BuyTicketButton)
val imageSrc = attributes.getResourceId(R.styleable.BuyTicketButton_imageSrc, 0)
@Nilzor
Nilzor / multiple_null_checks.kt
Created March 18, 2020 21:41
Kotlin shorthands
fun <R, A, B> withNoNulls(p1: A?, p2: B?, function: (p1: A, p2: B) -> R): R? = p1?.let { p2?.let { function.invoke(p1, p2) } }
fun <R, A, B, C> withNoNulls(p1: A?, p2: B?, p3: C?, function: (p1: A, p2: B, p3: C) -> R): R? = p1?.let { p2?.let { p3?.let { function.invoke(p1, p2, p3) } } }
@Nilzor
Nilzor / keybase.md
Created September 19, 2017 08:56
Keybase proof

Keybase proof

I hereby claim:

  • I am nilzor on github.
  • I am frodenilsen (https://keybase.io/frodenilsen) on keybase.
  • I have a public key ASAl5OwmAffcKHYFXAub-yC-Z2TP1v9XlbbFy70Qtt55eAo

To claim this, I am signing this object: