diff --git a/common/src/main/java/com/mapbox/common/module/provider/MapboxModuleProvider.kt b/common/src/main/java/com/mapbox/common/module/provider/MapboxModuleProvider.kt index 6e99540..732db51 100644 --- a/common/src/main/java/com/mapbox/common/module/provider/MapboxModuleProvider.kt +++ b/common/src/main/java/com/mapbox/common/module/provider/MapboxModuleProvider.kt @@ -21,7 +21,7 @@ object MapboxModuleProvider { type: MapboxModuleType, // finding a constructor requires exact params types, not subclass/implementations, // that's why we need to pass the expected interface class as well - paramsProvider: (MapboxModuleType) -> Array?, Any?>> + paramsProvider: (MapboxModuleType) -> Array ): T { try { val configurationClass = Class.forName( @@ -103,7 +103,7 @@ object MapboxModuleProvider { * Try to invoke a no-arg, public constructor. */ private val noArgConstructorCreator = object : ModuleInstanceProvider { - override fun getInstance(implClass: Class<*>, type: MapboxModuleType, paramsProvider: (MapboxModuleType) -> Array?, Any?>>): Any? { + override fun getInstance(implClass: Class<*>, type: MapboxModuleType, paramsProvider: (MapboxModuleType) -> Array): Any? { val constructor = implClass.getConstructor() return constructor.newInstance() } @@ -113,7 +113,7 @@ object MapboxModuleProvider { * Try to get the instance of a Kotlin object. */ private val kotlinObjectReferenceProvider = object : ModuleInstanceProvider { - override fun getInstance(implClass: Class<*>, type: MapboxModuleType, paramsProvider: (MapboxModuleType) -> Array?, Any?>>): Any? { + override fun getInstance(implClass: Class<*>, type: MapboxModuleType, paramsProvider: (MapboxModuleType) -> Array): Any? { return implClass.getField("INSTANCE").get(null) } } @@ -122,7 +122,7 @@ object MapboxModuleProvider { * Try to get the instance of a singleton. */ private val singletonReferenceProvider = object : ModuleInstanceProvider { - override fun getInstance(implClass: Class<*>, type: MapboxModuleType, paramsProvider: (MapboxModuleType) -> Array?, Any?>>): Any? { + override fun getInstance(implClass: Class<*>, type: MapboxModuleType, paramsProvider: (MapboxModuleType) -> Array): Any? { return implClass.getMethod("getInstance").invoke(null) } } @@ -131,11 +131,11 @@ object MapboxModuleProvider { * Try to use default arguments for and create a Mapbox default module. */ private val defaultMapboxModuleCreator = object : ModuleInstanceProvider { - override fun getInstance(implClass: Class<*>, type: MapboxModuleType, paramsProvider: (MapboxModuleType) -> Array?, Any?>>): Any? { + override fun getInstance(implClass: Class<*>, type: MapboxModuleType, paramsProvider: (MapboxModuleType) -> Array): Any? { val params = paramsProvider.invoke(type) val constructor = - implClass.getConstructor(*params.map { it.first }.toTypedArray()) - return constructor.newInstance(*params.map { it.second }.toTypedArray()) + implClass.getConstructor(*params.map { it.expectedArgumentClass }.toTypedArray()) + return constructor.newInstance(*params.map { it.argumentInstance }.toTypedArray()) } } @@ -161,9 +161,18 @@ object MapboxModuleProvider { fun getInstance( implClass: Class<*>, type: MapboxModuleType, - paramsProvider: (MapboxModuleType) -> Array?, Any?>> + paramsProvider: (MapboxModuleType) -> Array ): Any? } private fun String.asGetterFun() = "get${this[0].toUpperCase()}${this.substring(1)}" -} \ No newline at end of file +} + +/** + * Declares arguments used to create default Mapbox modules. + * + * @param expectedArgumentClass the exact [Class] that the default implementation of the module expects as an argument. + * This shouldn't be a subclass, but exactly what's in the declaration of the constructor/method we want to use. + * @param argumentInstance instance of the expected argument (can be a subclass) + */ +data class ModuleProviderArgument(val expectedArgumentClass: Class<*>, val argumentInstance: Any?) \ No newline at end of file diff --git a/examples/src/test/java/com/mapbox/common/examples/ModuleProviderTest.kt b/examples/src/test/java/com/mapbox/common/examples/ModuleProviderTest.kt index c9d382f..4ecb495 100644 --- a/examples/src/test/java/com/mapbox/common/examples/ModuleProviderTest.kt +++ b/examples/src/test/java/com/mapbox/common/examples/ModuleProviderTest.kt @@ -5,6 +5,7 @@ import com.mapbox.annotation.module.MapboxModuleType import com.mapbox.common.module.LibraryLoader import com.mapbox.common.module.provider.MapboxInvalidModuleException import com.mapbox.common.module.provider.MapboxModuleProvider +import com.mapbox.common.module.provider.ModuleProviderArgument import com.mapbox.module.Mapbox_OnboardRouterModuleConfiguration import com.mapbox.navigation.base.logger.Logger import com.mapbox.navigation.base.route.Router @@ -60,18 +61,18 @@ class ModuleProviderTest { MapboxModuleProvider.createModule(MapboxModuleType.CommonLogger, ::paramsProvider) } - private fun paramsProvider(type: MapboxModuleType): Array?, Any?>> { + private fun paramsProvider(type: MapboxModuleType): Array { return when (type) { MapboxModuleType.CommonLibraryLoader -> arrayOf() MapboxModuleType.CommonHttpClient -> TODO("not implemented") MapboxModuleType.CommonLogger -> arrayOf( - Router::class.java to MapboxModuleProvider.createModule(MapboxModuleType.NavigationTripNotification, ::paramsProvider) + ModuleProviderArgument(Router::class.java, MapboxModuleProvider.createModule(MapboxModuleType.NavigationTripNotification, ::paramsProvider)) ) MapboxModuleType.NavigationRouter -> arrayOf( - Router::class.java to MapboxModuleProvider.createModule(MapboxModuleType.NavigationOffboardRouter, ::paramsProvider) + ModuleProviderArgument(Router::class.java, MapboxModuleProvider.createModule(MapboxModuleType.NavigationOffboardRouter, ::paramsProvider)) ) MapboxModuleType.NavigationOffboardRouter -> arrayOf( - Context::class.java to mockk() + ModuleProviderArgument(Context::class.java, mockk()) ) MapboxModuleType.NavigationOnboardRouter -> arrayOf() MapboxModuleType.NavigationTripNotification -> TODO("not implemented")