Updated on 2026-08-14
This commit is contained in:
parent
c2e8cb82a7
commit
c428dc5bf5
9 changed files with 148 additions and 0 deletions
|
|
@ -1,4 +1,5 @@
|
|||
import com.tangem.plugin.configuration.configurations.TogglesGenerator
|
||||
import io.gitlab.arturbosch.detekt.Detekt
|
||||
|
||||
plugins {
|
||||
alias(deps.plugins.android.library)
|
||||
|
|
@ -58,6 +59,10 @@ tasks.named("preBuild") {
|
|||
dependsOn(generateToggles)
|
||||
}
|
||||
|
||||
tasks.withType<Detekt>().configureEach {
|
||||
exclude { it.file.absolutePath.contains("/build/generated/") }
|
||||
}
|
||||
|
||||
tasks.withType<Test>().configureEach {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,5 +70,9 @@
|
|||
{
|
||||
"name": "SWAP_AB_ENABLED",
|
||||
"version": "undefined"
|
||||
},
|
||||
{
|
||||
"name": "TWI_1403_PUSH_NOTIFICATION_SETTINGS_ENABLED",
|
||||
"version": "undefined"
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,61 @@
|
|||
package com.tangem.core.configtoggle.feature
|
||||
|
||||
import com.google.common.truth.Truth
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.squareup.moshi.Types
|
||||
import com.tangem.core.configtoggle.storage.ConfigToggle
|
||||
import org.junit.jupiter.api.Test
|
||||
import java.io.File
|
||||
|
||||
internal class FeatureTogglesNamingConventionTest {
|
||||
|
||||
@Test
|
||||
fun `all new feature toggles must follow AND_id or TWI_id naming`() {
|
||||
val toggles = parseToggles(CONFIG_FILE)
|
||||
|
||||
val invalid = toggles
|
||||
.map(ConfigToggle::name)
|
||||
.filterNot { it in EXCLUDED_TOGGLES_LIST }
|
||||
.filterNot(VALID_NAME_PATTERN::matches)
|
||||
|
||||
Truth.assertWithMessage(
|
||||
"""New feature toggles must match pattern ${VALID_NAME_PATTERN.pattern} — AND_<ticket_id> (Android ticket, e.g. AND_15312_PUSH_NOTIFICATION_SETTINGS_ENABLED) or TWI_<ticket_id> (idea ticket, e.g. TWI_1403_PUSH_NOTIFICATION_SETTINGS_ENABLED).
|
||||
|Either rename these or, only if you have an explicit reason, add them to LEGACY_EXCLUDED.""".trimMargin(),
|
||||
).that(invalid).isEmpty()
|
||||
}
|
||||
|
||||
private fun parseToggles(file: File): List<ConfigToggle> {
|
||||
val moshi = Moshi.Builder().build()
|
||||
val listType = Types.newParameterizedType(List::class.java, ConfigToggle::class.java)
|
||||
val adapter = moshi.adapter<List<ConfigToggle>>(listType)
|
||||
return requireNotNull(adapter.fromJson(file.readText())) { "Failed to parse $file" }
|
||||
}
|
||||
|
||||
private companion object {
|
||||
val VALID_NAME_PATTERN = Regex("""^(AND|TWI)_\d+(?:_[A-Z0-9]+)+$""")
|
||||
|
||||
val CONFIG_FILE = File("src/main/assets/configs/feature_toggles_config.json")
|
||||
|
||||
/** Toggles created before the AND_/TWI_ naming convention. Do NOT add new entries. */
|
||||
val EXCLUDED_TOGGLES_LIST = setOf(
|
||||
"ADDRESS_SYNC_ENABLED",
|
||||
"ADD_AND_MANAGE_TOKENS_ENABLED",
|
||||
"APP_REDESIGN_ENABLED",
|
||||
"ASSETS_DISCOVERY_ENABLED",
|
||||
"DYNAMIC_ADDRESSES_ENABLED",
|
||||
"GASLESS_APPROVAL_ENABLED",
|
||||
"HEDERA_ERC20_ENABLED",
|
||||
"NEW_CARD_SCANNING_ENABLED",
|
||||
"SOLANA_SCALED_UI_AMOUNT_ENABLED",
|
||||
"SOLANA_TX_HISTORY_ENABLED",
|
||||
"STAKING_ETH_ENABLED",
|
||||
"SWAP_AB_ENABLED",
|
||||
"SWAP_INTEGRATED_APPROVE",
|
||||
"SWAP_SWITCH_TO_TRANSFER_ENABLED",
|
||||
"USEDESK_ENABLED",
|
||||
"VIRTUAL_ACCOUNTS_ENABLED",
|
||||
"VISA_ONBOARDING_ENABLED",
|
||||
"WALLET_CONNECT_BITCOIN_ENABLED",
|
||||
)
|
||||
}
|
||||
}
|
||||
9
features/push-notification-settings/api/build.gradle.kts
Normal file
9
features/push-notification-settings/api/build.gradle.kts
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
plugins {
|
||||
alias(deps.plugins.android.library)
|
||||
alias(deps.plugins.kotlin.android)
|
||||
id("configuration")
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.tangem.features.pushnotificationsettings.api"
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
package com.tangem.features.pushnotificationsettings
|
||||
|
||||
interface PushNotificationSettingsFeatureToggles {
|
||||
val isPushNotificationSettingsEnabled: Boolean
|
||||
}
|
||||
26
features/push-notification-settings/impl/build.gradle.kts
Normal file
26
features/push-notification-settings/impl/build.gradle.kts
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
plugins {
|
||||
alias(deps.plugins.android.library)
|
||||
alias(deps.plugins.kotlin.android)
|
||||
alias(deps.plugins.kotlin.kapt)
|
||||
alias(deps.plugins.hilt.android)
|
||||
id("configuration")
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.tangem.features.pushnotificationsettings.impl"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
/** Api */
|
||||
implementation(projects.features.pushNotificationSettings.api)
|
||||
|
||||
/** Core modules */
|
||||
implementation(projects.core.configToggles)
|
||||
|
||||
/** Compose */
|
||||
implementation(deps.compose.runtime)
|
||||
|
||||
/** DI */
|
||||
implementation(deps.hilt.android)
|
||||
kapt(deps.hilt.kapt)
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package com.tangem.features.pushnotificationsettings
|
||||
|
||||
import com.tangem.core.configtoggle.FeatureToggles
|
||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
||||
|
||||
internal class DefaultPushNotificationSettingsFeatureToggles(
|
||||
private val featureTogglesManager: FeatureTogglesManager,
|
||||
) : PushNotificationSettingsFeatureToggles {
|
||||
|
||||
override val isPushNotificationSettingsEnabled: Boolean
|
||||
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.TWI_1403_PUSH_NOTIFICATION_SETTINGS_ENABLED)
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
package com.tangem.features.pushnotificationsettings.di
|
||||
|
||||
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
|
||||
import com.tangem.features.pushnotificationsettings.DefaultPushNotificationSettingsFeatureToggles
|
||||
import com.tangem.features.pushnotificationsettings.PushNotificationSettingsFeatureToggles
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
internal object PushNotificationSettingsFeatureModule {
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun providePushNotificationSettingsFeatureToggles(
|
||||
featureTogglesManager: FeatureTogglesManager,
|
||||
): PushNotificationSettingsFeatureToggles {
|
||||
return DefaultPushNotificationSettingsFeatureToggles(featureTogglesManager)
|
||||
}
|
||||
}
|
||||
|
|
@ -244,6 +244,9 @@ include(":features:push-notifications:impl")
|
|||
include(":features:wallet-settings:api")
|
||||
include(":features:wallet-settings:impl")
|
||||
|
||||
include(":features:push-notification-settings:api")
|
||||
include(":features:push-notification-settings:impl")
|
||||
|
||||
include(":features:markets:api")
|
||||
include(":features:markets:impl")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue