mirror of
				https://github.com/InsanusMokrassar/MicroUtils.git
				synced 2025-11-04 06:00:22 +00:00 
			
		
		
		
	argumentOrNull/argumentOrThrow
This commit is contained in:
		@@ -7,6 +7,9 @@
 | 
			
		||||
  * `Android AppCompat`: `1.4.2` -> `1.5.1`
 | 
			
		||||
  * Android Compile SDK: 32 -> 33
 | 
			
		||||
  * Android Build Tools: 32.0.0 -> 33.0.0
 | 
			
		||||
* `Common`:
 | 
			
		||||
  * `Android`:
 | 
			
		||||
    * Add `argumentOrNull`/`argumentOrThrow` delegates for fragments
 | 
			
		||||
* `Coroutines`:
 | 
			
		||||
  * Rewrite `awaitFirstWithDeferred` onto `CompletableDeferred` instead of coroutines suspending
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ kotlin {
 | 
			
		||||
        androidMain {
 | 
			
		||||
            dependencies {
 | 
			
		||||
                api project(":micro_utils.coroutines")
 | 
			
		||||
                api libs.android.fragment
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,76 @@
 | 
			
		||||
package dev.inmo.micro_utils.common
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.os.Parcelable
 | 
			
		||||
import androidx.fragment.app.Fragment
 | 
			
		||||
import java.io.Serializable
 | 
			
		||||
import kotlin.reflect.KProperty
 | 
			
		||||
 | 
			
		||||
object ArgumentPropertyNullableDelegate {
 | 
			
		||||
    operator fun <T: Any> getValue(thisRef: Fragment, property: KProperty<*>): T? {
 | 
			
		||||
        val arguments = thisRef.arguments ?: return null
 | 
			
		||||
        val key = property.name
 | 
			
		||||
        return when (property.getter.returnType.classifier) {
 | 
			
		||||
            // Scalars
 | 
			
		||||
            String::class -> arguments.getString(key)
 | 
			
		||||
            Boolean::class -> arguments.getBoolean(key)
 | 
			
		||||
            Byte::class -> arguments.getByte(key)
 | 
			
		||||
            Char::class -> arguments.getChar(key)
 | 
			
		||||
            Double::class -> arguments.getDouble(key)
 | 
			
		||||
            Float::class -> arguments.getFloat(key)
 | 
			
		||||
            Int::class -> arguments.getInt(key)
 | 
			
		||||
            Long::class -> arguments.getLong(key)
 | 
			
		||||
            Short::class -> arguments.getShort(key)
 | 
			
		||||
 | 
			
		||||
            // References
 | 
			
		||||
            Bundle::class -> arguments.getBundle(key)
 | 
			
		||||
            CharSequence::class -> arguments.getCharSequence(key)
 | 
			
		||||
            Parcelable::class -> arguments.getParcelable(key)
 | 
			
		||||
 | 
			
		||||
            // Scalar arrays
 | 
			
		||||
            BooleanArray::class -> arguments.getBooleanArray(key)
 | 
			
		||||
            ByteArray::class -> arguments.getByteArray(key)
 | 
			
		||||
            CharArray::class -> arguments.getCharArray(key)
 | 
			
		||||
            DoubleArray::class -> arguments.getDoubleArray(key)
 | 
			
		||||
            FloatArray::class -> arguments.getFloatArray(key)
 | 
			
		||||
            IntArray::class -> arguments.getIntArray(key)
 | 
			
		||||
            LongArray::class -> arguments.getLongArray(key)
 | 
			
		||||
            ShortArray::class -> arguments.getShortArray(key)
 | 
			
		||||
            Array::class -> {
 | 
			
		||||
                val componentType = property.returnType.classifier ?.javaClass ?.componentType!!
 | 
			
		||||
                @Suppress("UNCHECKED_CAST") // Checked by reflection.
 | 
			
		||||
                when {
 | 
			
		||||
                    Parcelable::class.java.isAssignableFrom(componentType) -> {
 | 
			
		||||
                        arguments.getParcelableArray(key)
 | 
			
		||||
                    }
 | 
			
		||||
                    String::class.java.isAssignableFrom(componentType) -> {
 | 
			
		||||
                        arguments.getStringArray(key)
 | 
			
		||||
                    }
 | 
			
		||||
                    CharSequence::class.java.isAssignableFrom(componentType) -> {
 | 
			
		||||
                        arguments.getCharSequenceArray(key)
 | 
			
		||||
                    }
 | 
			
		||||
                    Serializable::class.java.isAssignableFrom(componentType) -> {
 | 
			
		||||
                        arguments.getSerializable(key)
 | 
			
		||||
                    }
 | 
			
		||||
                    else -> {
 | 
			
		||||
                        val valueType = componentType.canonicalName
 | 
			
		||||
                        throw IllegalArgumentException(
 | 
			
		||||
                            "Illegal value array type $valueType for key \"$key\""
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            Serializable::class -> arguments.getSerializable(key)
 | 
			
		||||
            else -> null
 | 
			
		||||
        } as? T
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
object ArgumentPropertyNonNullableDelegate {
 | 
			
		||||
    operator fun <T: Any> getValue(thisRef: Fragment, property: KProperty<*>): T {
 | 
			
		||||
        return ArgumentPropertyNullableDelegate.getValue<T>(thisRef, property)!!
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun argumentOrNull() = ArgumentPropertyNullableDelegate
 | 
			
		||||
fun argumentOrThrow() = ArgumentPropertyNonNullableDelegate
 | 
			
		||||
@@ -23,6 +23,7 @@ dexcount = "3.1.0"
 | 
			
		||||
android-coreKtx = "1.9.0"
 | 
			
		||||
android-recyclerView = "1.2.1"
 | 
			
		||||
android-appCompat = "1.5.1"
 | 
			
		||||
android-fragment = "1.5.3"
 | 
			
		||||
android-espresso = "3.4.0"
 | 
			
		||||
android-test = "1.1.3"
 | 
			
		||||
 | 
			
		||||
@@ -71,6 +72,7 @@ jb-exposed = { module = "org.jetbrains.exposed:exposed-core", version.ref = "jb-
 | 
			
		||||
android-coreKtx = { module = "androidx.core:core-ktx", version.ref = "android-coreKtx" }
 | 
			
		||||
android-recyclerView = { module = "androidx.recyclerview:recyclerview", version.ref = "android-recyclerView" }
 | 
			
		||||
android-appCompat-resources = { module = "androidx.appcompat:appcompat-resources", version.ref = "android-appCompat" }
 | 
			
		||||
android-fragment = { module = "androidx.fragment:fragment", version.ref = "android-fragment" }
 | 
			
		||||
android-espresso = { module = "androidx.test.espresso:espresso-core", version.ref = "android-espresso" }
 | 
			
		||||
android-test-junit = { module = "androidx.test.ext:junit", version.ref = "android-test" }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user