Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
5229803
feat: add signed paykit watch-only accounts
ben-kaufman Jul 14, 2026
17bf435
fix: harden paykit account lifecycle
ben-kaufman Jul 15, 2026
e420d5d
fix: harden paykit account restore
ben-kaufman Jul 15, 2026
ced7553
chore: rename changelog fragment
ben-kaufman Jul 15, 2026
aa5a819
fix: recover completed account activation
ben-kaufman Jul 15, 2026
572f600
feat: stage Paykit server authorization
ben-kaufman Jul 16, 2026
7d4fce8
refactor: drop unpublished paykit compatibility
ben-kaufman Jul 16, 2026
8a81d63
refactor: simplify watch-only account lifecycle
ben-kaufman Jul 16, 2026
9d5f280
refactor: polish paykit account setup
ben-kaufman Jul 16, 2026
db7d5ef
fix: simplify watch-only auth retries
ben-kaufman Jul 16, 2026
0e6bb0f
fix: align Paykit auth UI
ben-kaufman Jul 16, 2026
45782a6
feat: add Paykit receiver Noise keys
ben-kaufman Jul 20, 2026
edb688f
fix: derive Paykit Noise key from wallet seed
ben-kaufman Jul 20, 2026
6b45493
chore: update LDK Node to rc.57
ben-kaufman Jul 22, 2026
653eea4
fix: gate server accounts behind Paykit UI
ben-kaufman Jul 22, 2026
0d34126
fix: align pubky and paykit ui
ben-kaufman Jul 20, 2026
0a3c85c
fix: polish pubky and paykit ui
ben-kaufman Jul 20, 2026
cf58052
fix: restore intro test ids
ben-kaufman Jul 22, 2026
b0f0c0a
fix: align Paykit authorization flows
ben-kaufman Jul 22, 2026
59b4bd4
Merge branch 'master' into codex/paykit-watch-only-accounts
jvsena42 Jul 23, 2026
e7b836f
fix: route home scan + harden watch-only auth
ben-kaufman Jul 24, 2026
1ceb420
Merge branch 'master' into codex/paykit-watch-only-accounts
ovitrif Jul 27, 2026
c8ac595
Merge pull request #1097 from synonymdev/codex/970-pubky-paykit-ui-pa…
ovitrif Jul 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions app/src/androidTest/java/to/bitkit/ui/components/TagButtonTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package to.bitkit.ui.components

import androidx.compose.ui.test.assertHasClickAction
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import to.bitkit.test.annotations.ComposeUi
import to.bitkit.ui.theme.AppThemeSurface

@HiltAndroidTest
@ComposeUi
class TagButtonTest {
@get:Rule
val hiltRule = HiltAndroidRule(this)

@get:Rule
val composeTestRule = createComposeRule()

@Before
fun setup() {
hiltRule.inject()
}

@Test
fun removableTagExposesItsAction() {
composeTestRule.setContent {
AppThemeSurface {
TagButton(
text = "Founder",
onClick = {},
accessibilityLabel = "Remove Founder tag",
displayIconClose = true,
)
}
}

composeTestRule.onNodeWithContentDescription("Remove Founder tag")
.assertHasClickAction()
composeTestRule.onNodeWithTag("Tag-Founder")
.assertHasClickAction()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package to.bitkit.ui.components.settings

import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.SemanticsProperties
import androidx.compose.ui.test.SemanticsMatcher
import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertHasClickAction
import androidx.compose.ui.test.assertIsEnabled
import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.assertIsOff
import androidx.compose.ui.test.assertIsOn
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import to.bitkit.test.annotations.ComposeUi
import to.bitkit.ui.theme.AppThemeSurface

@HiltAndroidTest
@ComposeUi
class SettingsSwitchRowTest {
@get:Rule
val hiltRule = HiltAndroidRule(this)

@get:Rule
val composeTestRule = createComposeRule()

@Before
fun setup() {
hiltRule.inject()
}

@Test
fun switchSemanticsReflectCheckedState() {
composeTestRule.setContent {
AppThemeSurface {
SettingsSwitchRow(
title = "Contact payments",
isChecked = true,
onClick = {},
switchTestTag = "ContactPaymentsSwitch",
)
}
}

composeTestRule.onNodeWithTag("ContactPaymentsSwitch")
.assertIsOn()
.assertIsEnabled()
.assertHasClickAction()
.assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Switch))
}

@Test
fun switchSemanticsReflectUncheckedState() {
composeTestRule.setContent {
AppThemeSurface {
SettingsSwitchRow(
title = "Contact payments",
isChecked = false,
onClick = {},
switchTestTag = "ContactPaymentsSwitch",
)
}
}

composeTestRule.onNodeWithTag("ContactPaymentsSwitch").assertIsOff()
}

@Test
fun switchSemanticsReflectDisabledState() {
composeTestRule.setContent {
AppThemeSurface {
SettingsSwitchRow(
title = "Contact payments",
isChecked = false,
onClick = {},
enabled = false,
switchTestTag = "ContactPaymentsSwitch",
)
}
}

composeTestRule.onNodeWithTag("ContactPaymentsSwitch")
.assertIsOff()
.assertIsNotEnabled()
}
}
10 changes: 9 additions & 1 deletion app/src/main/java/to/bitkit/data/SettingsStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class SettingsStore @Inject constructor(

suspend fun restoreFromBackup(payload: SettingsBackupV1) =
runCatching {
val data = payload.settings.resetPin()
val data = payload.settings.resetPin().withDefaultPaykitPaymentMethods()
store.updateData { data }

val monitored = data.addressTypesToMonitor
Expand Down Expand Up @@ -164,6 +164,14 @@ fun SettingsData.resetPin() = this.copy(
isBiometricEnabled = false,
)

fun SettingsData.areContactPaymentsEnabled(): Boolean =
sharesPublicPaykitEndpoints || sharesPrivatePaykitEndpoints

fun SettingsData.withDefaultPaykitPaymentMethods() = copy(
publicPaykitLightningEnabled = true,
publicPaykitOnchainEnabled = true,
)

fun SettingsData.hasPublicPaykitPublicationState(): Boolean =
hasConfirmedPublicPaykitEndpoints ||
sharesPublicPaykitEndpoints ||
Expand Down
Loading
Loading