diff --git a/kotlin-extensions/build.gradle b/kotlin-extensions/build.gradle index acea491..afbabac 100644 --- a/kotlin-extensions/build.gradle +++ b/kotlin-extensions/build.gradle @@ -2,6 +2,7 @@ apply from: "../android-configs/lib-config.gradle" dependencies { implementation "androidx.recyclerview:recyclerview" + implementation "androidx.fragment:fragment-ktx" implementation project(path: ':logging') constraints { @@ -10,5 +11,11 @@ dependencies { require '1.0.0' } } + + implementation("androidx.fragment:fragment-ktx") { + version { + require '1.2.1' + } + } } } diff --git a/kotlin-extensions/src/main/java/ru/touchin/extensions/Fragment.kt b/kotlin-extensions/src/main/java/ru/touchin/extensions/Fragment.kt new file mode 100644 index 0000000..5057385 --- /dev/null +++ b/kotlin-extensions/src/main/java/ru/touchin/extensions/Fragment.kt @@ -0,0 +1,38 @@ +package ru.touchin.extensions + +import android.os.Bundle +import android.os.Parcelable +import androidx.fragment.app.Fragment +import ru.touchin.utils.BundleExtractorDelegate +import kotlin.properties.ReadWriteProperty + +inline fun Fragment.args( + key: String? = null, + defaultValue: T? = null +): ReadWriteProperty { + return BundleExtractorDelegate { thisRef, property -> + val bundleKey = key ?: property.name + extractFromBundle(thisRef.arguments, bundleKey, defaultValue) + } +} + +fun T.withArgs(receiver: Bundle.() -> Unit): T { + arguments = Bundle().apply(receiver) + return this +} + +fun T.withParcelable(key: String, parcelable: Parcelable): T = withArgs { + putParcelable(key, parcelable) +} + +inline fun extractFromBundle( + bundle: Bundle?, + key: String? = null, + defaultValue: T? = null +): T { + val result = bundle?.get(key) ?: defaultValue + if (result != null && result !is T) { + throw ClassCastException("Property for $key has different class type") + } + return result as T +} diff --git a/kotlin-extensions/src/main/java/ru/touchin/utils/BundleExtractorDelegate.kt b/kotlin-extensions/src/main/java/ru/touchin/utils/BundleExtractorDelegate.kt new file mode 100644 index 0000000..0cf2d59 --- /dev/null +++ b/kotlin-extensions/src/main/java/ru/touchin/utils/BundleExtractorDelegate.kt @@ -0,0 +1,25 @@ +package ru.touchin.utils + +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +class BundleExtractorDelegate(private val initializer: (R, KProperty<*>) -> T) : ReadWriteProperty { + + private object EMPTY + + private var value: Any? = EMPTY + + override fun setValue(thisRef: R, property: KProperty<*>, value: T) { + this.value = value + } + + override fun getValue(thisRef: R, property: KProperty<*>): T { + if (value == EMPTY) { + value = initializer(thisRef, property) + } + + @Suppress("UNCHECKED_CAST") + return value as T + } + +}