package com.leodroidcoder.remoteconfigsample import com.google.firebase.remoteconfig.FirebaseRemoteConfig import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings import com.google.gson.Gson import javax.inject.Inject import javax.inject.Singleton @Singleton class RemoteConfigManager @Inject constructor( private val gson: Gson ) : IRemoteConfigAPI { private val config: FirebaseRemoteConfig = FirebaseRemoteConfig.getInstance().apply { val configSettings = FirebaseRemoteConfigSettings.Builder() .setMinimumFetchIntervalInSeconds(CONFIG_CACHE_EXPIRATION_SECONDS) .build() setConfigSettingsAsync(configSettings) fetch(CONFIG_CACHE_EXPIRATION_SECONDS) .addOnCompleteListener { if (it.isSuccessful) { activateFetched() } } } override fun getSomeCoolParameter(): String = read(ConfigParam.SOME_COOL_PARAMETER) ?: SOME_DEFAULT_VALUE override fun getBannerData(): AdBannerData = read(ConfigParam.BANNER_DATA) ?: AdBannerData("manage_it_yourself", false) private inline fun read(param: ConfigParam): T? = read(param, T::class.java) private fun read(param: ConfigParam, returnType: Class): T? { val value: Any? = when (returnType) { String::class.java -> config.getString(param.key) Boolean::class.java -> config.getBoolean(param.key) Long::class.java -> config.getLong(param.key) Int::class.java -> config.getLong(param.key).toInt() Double::class.java -> config.getDouble(param.key) Float::class.java -> config.getDouble(param.key).toFloat() else -> { val json = config.getString(param.key) json.takeIf { it.isNotBlank() }?.let { gson.jsonToObjectOrNull(json, returnType) } } } @Suppress("UNCHECKED_CAST") return (value as? T) } private enum class ConfigParam(val key: String) { SOME_COOL_PARAMETER("some_cool_parameter"), BANNER_DATA("banner_data"), } private companion object { /** * Config expiration interval 30 minutes. */ private const val CONFIG_CACHE_EXPIRATION_SECONDS = 900L private const val SOME_DEFAULT_VALUE = "Any default value" } }