From 0f2652a1918ac2d6205c6b0afb006007cba3b907 Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Thu, 10 Sep 2026 15:07:14 +0200 Subject: [PATCH 1/4] fix: skip push registration in e2e builds --- .github/workflows/e2e.yml | 2 ++ .github/workflows/e2e_migration.yml | 1 + app/build.gradle.kts | 2 ++ app/src/main/java/to/bitkit/env/Env.kt | 1 + .../to/bitkit/repositories/LightningRepo.kt | 10 +++++++- .../bitkit/viewmodels/DevSettingsViewModel.kt | 10 ++++++++ .../bitkit/repositories/LightningRepoTest.kt | 23 +++++++++++++++++++ 7 files changed, 48 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index c25fc50444..a64d7007a2 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -75,6 +75,7 @@ jobs: CHATWOOT_API: ${{ secrets.CHATWOOT_API }} E2E: true GEO: false + PUSH_REGISTRATION_ENABLED: false run: ./gradlew assembleDevDebug - name: Rename APK @@ -126,6 +127,7 @@ jobs: E2E: true E2E_BACKEND: network GEO: false + PUSH_REGISTRATION_ENABLED: false TREZOR_BRIDGE: true TREZOR_BRIDGE_URL: http://10.0.2.2:21325 run: ./gradlew assembleDevDebug diff --git a/.github/workflows/e2e_migration.yml b/.github/workflows/e2e_migration.yml index 69da1b9d04..c13f030c23 100644 --- a/.github/workflows/e2e_migration.yml +++ b/.github/workflows/e2e_migration.yml @@ -56,6 +56,7 @@ jobs: E2E: true E2E_BACKEND: network GEO: false + PUSH_REGISTRATION_ENABLED: false run: ./gradlew assembleDevDebug - name: Rename APK diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 275472ebdd..ffd927485a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -81,6 +81,7 @@ val e2eHomegateUrlEnv = providers.environmentVariable("E2E_HOMEGATE_URL") .orElse(e2eLocalHostEnv.map { "http://$it:6288" }) val e2eHomeserverPubkyEnv = providers.environmentVariable("E2E_HOMESERVER_PUBKY").orElse("") val geoEnv = envFlag("GEO", default = true) +val pushRegistrationEnabledEnv = envFlag("PUSH_REGISTRATION_ENABLED", default = true) val paykitUiDisabledEnv = envFlag("PAYKIT_UI_DISABLED", default = false) val trezorBridgeEnv = localProp("TREZOR_BRIDGE").map { it.toBoolean().toString() }.orElse("false") val trezorBridgeUrlEnv = localProp("TREZOR_BRIDGE_URL").orElse("http://10.0.2.2:21325") @@ -328,6 +329,7 @@ androidComponents { buildConfigFields.put("TREZOR_BRIDGE", trezorBridgeEnv.booleanField()) buildConfigFields.put("TREZOR_BRIDGE_URL", trezorBridgeUrlEnv.stringField()) buildConfigFields.put("GEO", geoEnv.booleanField()) + buildConfigFields.put("PUSH_REGISTRATION_ENABLED", pushRegistrationEnabledEnv.booleanField()) buildConfigFields.put("FEATURE_PAYKIT_UI_DISABLED", paykitUiDisabledEnv.booleanField()) buildConfigFields.put("LOCALES", provider { bcp47Locales.joinToString(",") }.stringField()) buildConfigFields.put( diff --git a/app/src/main/java/to/bitkit/env/Env.kt b/app/src/main/java/to/bitkit/env/Env.kt index 3b306a9cc9..d025bcff67 100644 --- a/app/src/main/java/to/bitkit/env/Env.kt +++ b/app/src/main/java/to/bitkit/env/Env.kt @@ -20,6 +20,7 @@ internal object Env { val isDebug = BuildConfig.DEBUG const val isE2eTest = BuildConfig.E2E const val isGeoblockingEnabled = BuildConfig.GEO + const val isPushRegistrationEnabled = BuildConfig.PUSH_REGISTRATION_ENABLED val e2eBackend = BuildConfig.E2E_BACKEND.lowercase() val isLocalE2eBackend = isE2eTest && e2eBackend == "local" const val e2eLocalHost = BuildConfig.E2E_LOCAL_HOST diff --git a/app/src/main/java/to/bitkit/repositories/LightningRepo.kt b/app/src/main/java/to/bitkit/repositories/LightningRepo.kt index 0735b6a654..2274a6657e 100644 --- a/app/src/main/java/to/bitkit/repositories/LightningRepo.kt +++ b/app/src/main/java/to/bitkit/repositories/LightningRepo.kt @@ -1666,7 +1666,15 @@ class LightningRepo @Inject constructor( fun separateTrustedChannels(channels: List) = lightningService.separateTrustedChannels(channels) - suspend fun registerForNotifications(token: String? = null) = executeWhenNodeRunning("registerForNotifications") { + suspend fun registerForNotifications( + token: String? = null, + isPushRegistrationEnabled: Boolean = Env.isPushRegistrationEnabled, + ) = executeWhenNodeRunning("registerForNotifications") { + if (!isPushRegistrationEnabled) { + Logger.info("Skipped push registration, disabled via build config", context = TAG) + return@executeWhenNodeRunning Result.success(Unit) + } + runCatching { val token = token ?: firebaseMessaging.token.await() val cachedToken = keychain.loadString(Keychain.Key.PUSH_NOTIFICATION_TOKEN.name) diff --git a/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt index 4d788524e5..332f4604ee 100644 --- a/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt @@ -59,6 +59,10 @@ class DevSettingsViewModel @Inject constructor( private val blocktankRepo: BlocktankRepo, private val appDb: AppDb, ) : ViewModel() { + companion object { + private const val TAG = "DevSettingsViewModel" + } + private val _legacyRnRecoveryState = MutableStateFlow(LegacyRnRecoveryUiState()) val legacyRnRecoveryState = _legacyRnRecoveryState.asStateFlow() @@ -167,7 +171,13 @@ class DevSettingsViewModel @Inject constructor( .onFailure { ToastEventBus.send(it) } } + @Suppress("KotlinConstantConditions") fun registerForNotifications() = viewModelScope.launch { + if (!Env.isPushRegistrationEnabled) { + Logger.info("Skipped manual push registration, disabled via build config", context = TAG) + ToastEventBus.send(type = Toast.ToastType.INFO, title = "Push registration disabled in this build") + return@launch + } lightningRepo.registerForNotifications() .onSuccess { ToastEventBus.send(type = Toast.ToastType.INFO, title = "Registered for notifications") diff --git a/app/src/test/java/to/bitkit/repositories/LightningRepoTest.kt b/app/src/test/java/to/bitkit/repositories/LightningRepoTest.kt index 1c5432c325..243c8734d4 100644 --- a/app/src/test/java/to/bitkit/repositories/LightningRepoTest.kt +++ b/app/src/test/java/to/bitkit/repositories/LightningRepoTest.kt @@ -958,6 +958,29 @@ class LightningRepoTest : BaseUnitTest() { assertTrue(result.isFailure) } + @Test + fun `registerForNotifications should register new device token`() = test { + startNodeForTesting() + val token = "fcm-token" + whenever(keychain.loadString(Keychain.Key.PUSH_NOTIFICATION_TOKEN.name)).thenReturn(null) + whenever { lspNotificationsService.registerDevice(token) }.thenReturn(Unit) + + val result = sut.registerForNotifications(token = token) + + assertTrue(result.isSuccess) + verifyBlocking(lspNotificationsService) { registerDevice(token) } + } + + @Test + fun `registerForNotifications should skip device registration when push registration is disabled`() = test { + startNodeForTesting() + + val result = sut.registerForNotifications(token = "fcm-token", isPushRegistrationEnabled = false) + + assertTrue(result.isSuccess) + verifyBlocking(lspNotificationsService, never()) { registerDevice(any()) } + } + @Test fun `restartWithElectrumServer should setup with new server`() = test { startNodeForTesting() From 15c7358cb6af6f1231fa528272fbfdf5fd6eab5f Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Thu, 10 Sep 2026 15:15:41 +0200 Subject: [PATCH 2/4] fix: simplify push flag to PUSH build config --- .github/workflows/e2e.yml | 4 ++-- .github/workflows/e2e_migration.yml | 2 +- app/build.gradle.kts | 4 ++-- app/src/main/java/to/bitkit/env/Env.kt | 2 +- .../to/bitkit/repositories/LightningRepo.kt | 8 +++---- .../bitkit/viewmodels/DevSettingsViewModel.kt | 10 -------- .../bitkit/repositories/LightningRepoTest.kt | 23 ------------------- 7 files changed, 9 insertions(+), 44 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index a64d7007a2..a9a8028df2 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -75,7 +75,7 @@ jobs: CHATWOOT_API: ${{ secrets.CHATWOOT_API }} E2E: true GEO: false - PUSH_REGISTRATION_ENABLED: false + PUSH: false run: ./gradlew assembleDevDebug - name: Rename APK @@ -127,7 +127,7 @@ jobs: E2E: true E2E_BACKEND: network GEO: false - PUSH_REGISTRATION_ENABLED: false + PUSH: false TREZOR_BRIDGE: true TREZOR_BRIDGE_URL: http://10.0.2.2:21325 run: ./gradlew assembleDevDebug diff --git a/.github/workflows/e2e_migration.yml b/.github/workflows/e2e_migration.yml index c13f030c23..8ea5ab6706 100644 --- a/.github/workflows/e2e_migration.yml +++ b/.github/workflows/e2e_migration.yml @@ -56,7 +56,7 @@ jobs: E2E: true E2E_BACKEND: network GEO: false - PUSH_REGISTRATION_ENABLED: false + PUSH: false run: ./gradlew assembleDevDebug - name: Rename APK diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ffd927485a..dd74e6cc4f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -81,7 +81,7 @@ val e2eHomegateUrlEnv = providers.environmentVariable("E2E_HOMEGATE_URL") .orElse(e2eLocalHostEnv.map { "http://$it:6288" }) val e2eHomeserverPubkyEnv = providers.environmentVariable("E2E_HOMESERVER_PUBKY").orElse("") val geoEnv = envFlag("GEO", default = true) -val pushRegistrationEnabledEnv = envFlag("PUSH_REGISTRATION_ENABLED", default = true) +val pushEnv = envFlag("PUSH", default = true) val paykitUiDisabledEnv = envFlag("PAYKIT_UI_DISABLED", default = false) val trezorBridgeEnv = localProp("TREZOR_BRIDGE").map { it.toBoolean().toString() }.orElse("false") val trezorBridgeUrlEnv = localProp("TREZOR_BRIDGE_URL").orElse("http://10.0.2.2:21325") @@ -329,7 +329,7 @@ androidComponents { buildConfigFields.put("TREZOR_BRIDGE", trezorBridgeEnv.booleanField()) buildConfigFields.put("TREZOR_BRIDGE_URL", trezorBridgeUrlEnv.stringField()) buildConfigFields.put("GEO", geoEnv.booleanField()) - buildConfigFields.put("PUSH_REGISTRATION_ENABLED", pushRegistrationEnabledEnv.booleanField()) + buildConfigFields.put("PUSH", pushEnv.booleanField()) buildConfigFields.put("FEATURE_PAYKIT_UI_DISABLED", paykitUiDisabledEnv.booleanField()) buildConfigFields.put("LOCALES", provider { bcp47Locales.joinToString(",") }.stringField()) buildConfigFields.put( diff --git a/app/src/main/java/to/bitkit/env/Env.kt b/app/src/main/java/to/bitkit/env/Env.kt index d025bcff67..aaeb97bec4 100644 --- a/app/src/main/java/to/bitkit/env/Env.kt +++ b/app/src/main/java/to/bitkit/env/Env.kt @@ -20,7 +20,7 @@ internal object Env { val isDebug = BuildConfig.DEBUG const val isE2eTest = BuildConfig.E2E const val isGeoblockingEnabled = BuildConfig.GEO - const val isPushRegistrationEnabled = BuildConfig.PUSH_REGISTRATION_ENABLED + const val isPushEnabled = BuildConfig.PUSH val e2eBackend = BuildConfig.E2E_BACKEND.lowercase() val isLocalE2eBackend = isE2eTest && e2eBackend == "local" const val e2eLocalHost = BuildConfig.E2E_LOCAL_HOST diff --git a/app/src/main/java/to/bitkit/repositories/LightningRepo.kt b/app/src/main/java/to/bitkit/repositories/LightningRepo.kt index 16e52cab44..b5ea2eb70f 100644 --- a/app/src/main/java/to/bitkit/repositories/LightningRepo.kt +++ b/app/src/main/java/to/bitkit/repositories/LightningRepo.kt @@ -1670,11 +1670,9 @@ class LightningRepo @Inject constructor( fun separateTrustedChannels(channels: List) = lightningService.separateTrustedChannels(channels) - suspend fun registerForNotifications( - token: String? = null, - isPushRegistrationEnabled: Boolean = Env.isPushRegistrationEnabled, - ) = executeWhenNodeRunning("registerForNotifications") { - if (!isPushRegistrationEnabled) { + @Suppress("KotlinConstantConditions") + suspend fun registerForNotifications(token: String? = null) = executeWhenNodeRunning("registerForNotifications") { + if (!Env.isPushEnabled) { Logger.info("Skipped push registration, disabled via build config", context = TAG) return@executeWhenNodeRunning Result.success(Unit) } diff --git a/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt index 332f4604ee..4d788524e5 100644 --- a/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt @@ -59,10 +59,6 @@ class DevSettingsViewModel @Inject constructor( private val blocktankRepo: BlocktankRepo, private val appDb: AppDb, ) : ViewModel() { - companion object { - private const val TAG = "DevSettingsViewModel" - } - private val _legacyRnRecoveryState = MutableStateFlow(LegacyRnRecoveryUiState()) val legacyRnRecoveryState = _legacyRnRecoveryState.asStateFlow() @@ -171,13 +167,7 @@ class DevSettingsViewModel @Inject constructor( .onFailure { ToastEventBus.send(it) } } - @Suppress("KotlinConstantConditions") fun registerForNotifications() = viewModelScope.launch { - if (!Env.isPushRegistrationEnabled) { - Logger.info("Skipped manual push registration, disabled via build config", context = TAG) - ToastEventBus.send(type = Toast.ToastType.INFO, title = "Push registration disabled in this build") - return@launch - } lightningRepo.registerForNotifications() .onSuccess { ToastEventBus.send(type = Toast.ToastType.INFO, title = "Registered for notifications") diff --git a/app/src/test/java/to/bitkit/repositories/LightningRepoTest.kt b/app/src/test/java/to/bitkit/repositories/LightningRepoTest.kt index af5c8ea1d7..b694f62fd0 100644 --- a/app/src/test/java/to/bitkit/repositories/LightningRepoTest.kt +++ b/app/src/test/java/to/bitkit/repositories/LightningRepoTest.kt @@ -959,29 +959,6 @@ class LightningRepoTest : BaseUnitTest() { assertTrue(result.isFailure) } - @Test - fun `registerForNotifications should register new device token`() = test { - startNodeForTesting() - val token = "fcm-token" - whenever(keychain.loadString(Keychain.Key.PUSH_NOTIFICATION_TOKEN.name)).thenReturn(null) - whenever { lspNotificationsService.registerDevice(token) }.thenReturn(Unit) - - val result = sut.registerForNotifications(token = token) - - assertTrue(result.isSuccess) - verifyBlocking(lspNotificationsService) { registerDevice(token) } - } - - @Test - fun `registerForNotifications should skip device registration when push registration is disabled`() = test { - startNodeForTesting() - - val result = sut.registerForNotifications(token = "fcm-token", isPushRegistrationEnabled = false) - - assertTrue(result.isSuccess) - verifyBlocking(lspNotificationsService, never()) { registerDevice(any()) } - } - @Test fun `restartWithElectrumServer should setup with new server`() = test { startNodeForTesting() From 618d0b2480ee193c225e7a872873c0f8743009dd Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Thu, 10 Sep 2026 15:28:06 +0200 Subject: [PATCH 3/4] fix: reuse E2E flag to skip push registration --- .github/workflows/e2e.yml | 2 -- .github/workflows/e2e_migration.yml | 1 - app/build.gradle.kts | 2 -- app/src/main/java/to/bitkit/env/Env.kt | 1 - app/src/main/java/to/bitkit/repositories/LightningRepo.kt | 4 ++-- 5 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index a9a8028df2..c25fc50444 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -75,7 +75,6 @@ jobs: CHATWOOT_API: ${{ secrets.CHATWOOT_API }} E2E: true GEO: false - PUSH: false run: ./gradlew assembleDevDebug - name: Rename APK @@ -127,7 +126,6 @@ jobs: E2E: true E2E_BACKEND: network GEO: false - PUSH: false TREZOR_BRIDGE: true TREZOR_BRIDGE_URL: http://10.0.2.2:21325 run: ./gradlew assembleDevDebug diff --git a/.github/workflows/e2e_migration.yml b/.github/workflows/e2e_migration.yml index 8ea5ab6706..69da1b9d04 100644 --- a/.github/workflows/e2e_migration.yml +++ b/.github/workflows/e2e_migration.yml @@ -56,7 +56,6 @@ jobs: E2E: true E2E_BACKEND: network GEO: false - PUSH: false run: ./gradlew assembleDevDebug - name: Rename APK diff --git a/app/build.gradle.kts b/app/build.gradle.kts index dd74e6cc4f..275472ebdd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -81,7 +81,6 @@ val e2eHomegateUrlEnv = providers.environmentVariable("E2E_HOMEGATE_URL") .orElse(e2eLocalHostEnv.map { "http://$it:6288" }) val e2eHomeserverPubkyEnv = providers.environmentVariable("E2E_HOMESERVER_PUBKY").orElse("") val geoEnv = envFlag("GEO", default = true) -val pushEnv = envFlag("PUSH", default = true) val paykitUiDisabledEnv = envFlag("PAYKIT_UI_DISABLED", default = false) val trezorBridgeEnv = localProp("TREZOR_BRIDGE").map { it.toBoolean().toString() }.orElse("false") val trezorBridgeUrlEnv = localProp("TREZOR_BRIDGE_URL").orElse("http://10.0.2.2:21325") @@ -329,7 +328,6 @@ androidComponents { buildConfigFields.put("TREZOR_BRIDGE", trezorBridgeEnv.booleanField()) buildConfigFields.put("TREZOR_BRIDGE_URL", trezorBridgeUrlEnv.stringField()) buildConfigFields.put("GEO", geoEnv.booleanField()) - buildConfigFields.put("PUSH", pushEnv.booleanField()) buildConfigFields.put("FEATURE_PAYKIT_UI_DISABLED", paykitUiDisabledEnv.booleanField()) buildConfigFields.put("LOCALES", provider { bcp47Locales.joinToString(",") }.stringField()) buildConfigFields.put( diff --git a/app/src/main/java/to/bitkit/env/Env.kt b/app/src/main/java/to/bitkit/env/Env.kt index aaeb97bec4..3b306a9cc9 100644 --- a/app/src/main/java/to/bitkit/env/Env.kt +++ b/app/src/main/java/to/bitkit/env/Env.kt @@ -20,7 +20,6 @@ internal object Env { val isDebug = BuildConfig.DEBUG const val isE2eTest = BuildConfig.E2E const val isGeoblockingEnabled = BuildConfig.GEO - const val isPushEnabled = BuildConfig.PUSH val e2eBackend = BuildConfig.E2E_BACKEND.lowercase() val isLocalE2eBackend = isE2eTest && e2eBackend == "local" const val e2eLocalHost = BuildConfig.E2E_LOCAL_HOST diff --git a/app/src/main/java/to/bitkit/repositories/LightningRepo.kt b/app/src/main/java/to/bitkit/repositories/LightningRepo.kt index b5ea2eb70f..7b4888f970 100644 --- a/app/src/main/java/to/bitkit/repositories/LightningRepo.kt +++ b/app/src/main/java/to/bitkit/repositories/LightningRepo.kt @@ -1672,8 +1672,8 @@ class LightningRepo @Inject constructor( @Suppress("KotlinConstantConditions") suspend fun registerForNotifications(token: String? = null) = executeWhenNodeRunning("registerForNotifications") { - if (!Env.isPushEnabled) { - Logger.info("Skipped push registration, disabled via build config", context = TAG) + if (Env.isE2eTest) { + Logger.info("Skipped push registration in E2E build", context = TAG) return@executeWhenNodeRunning Result.success(Unit) } From ab243340f07cef821dc09b309894e63e9dae5bb0 Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Fri, 11 Sep 2026 18:25:01 +0200 Subject: [PATCH 4/4] fix: toast skipped push registration in e2e --- .../main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt index 4d788524e5..117af4f652 100644 --- a/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/DevSettingsViewModel.kt @@ -170,7 +170,9 @@ class DevSettingsViewModel @Inject constructor( fun registerForNotifications() = viewModelScope.launch { lightningRepo.registerForNotifications() .onSuccess { - ToastEventBus.send(type = Toast.ToastType.INFO, title = "Registered for notifications") + @Suppress("KotlinConstantConditions") + val title = if (Env.isE2eTest) "Skipped push registration" else "Registered for notifications" + ToastEventBus.send(type = Toast.ToastType.INFO, title = title) } .onFailure { ToastEventBus.send(it) } }