Skip to content

Commit 580246f

Browse files
authored
Merge branch 'master' into feat/system-widgets-foundation
2 parents c082153 + 93b36b5 commit 580246f

31 files changed

Lines changed: 1176 additions & 247 deletions

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Changed
11+
- Improve Pubky profile restore, contact editing, and contact routing flows #905
12+
1013
### Fixed
1114
- Polish Terms of Use screen padding to match iOS #903
1215

app/src/main/java/to/bitkit/models/BackupPayloads.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.synonym.bitkitcore.IBtInfo
77
import com.synonym.bitkitcore.IBtOrder
88
import com.synonym.bitkitcore.IcJitEntry
99
import com.synonym.bitkitcore.PreActivityMetadata
10+
import kotlinx.serialization.SerialName
1011
import kotlinx.serialization.Serializable
1112
import to.bitkit.data.AppCacheData
1213
import to.bitkit.data.SettingsData
@@ -26,8 +27,24 @@ data class MetadataBackupV1(
2627
val createdAt: Long,
2728
val tagMetadata: List<PreActivityMetadata>,
2829
val cache: AppCacheData,
30+
val pubkySession: PubkySessionBackupV1? = null,
2931
)
3032

33+
@Serializable
34+
data class PubkySessionBackupV1(
35+
val kind: PubkySessionBackupKind,
36+
val sessionSecret: String? = null,
37+
)
38+
39+
@Serializable
40+
enum class PubkySessionBackupKind {
41+
@SerialName("localSeed")
42+
LocalSeed,
43+
44+
@SerialName("externalSession")
45+
ExternalSession,
46+
}
47+
3148
@Serializable
3249
data class BlocktankBackupV1(
3350
val version: Int = 1,

app/src/main/java/to/bitkit/repositories/BackupRepo.kt

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ class BackupRepo @Inject constructor(
8484
private val widgetsStore: WidgetsStore,
8585
private val blocktankRepo: BlocktankRepo,
8686
private val activityRepo: ActivityRepo,
87+
private val pubkyRepo: PubkyRepo,
8788
private val preActivityMetadataRepo: PreActivityMetadataRepo,
8889
private val lightningService: LightningService,
8990
private val clock: Clock,
@@ -268,6 +269,16 @@ class BackupRepo @Inject constructor(
268269
}
269270
dataListenerJobs.add(preActivityMetadataJob)
270271

272+
val pubkyStateJob = scope.launch {
273+
pubkyRepo.backupStateVersion
274+
.drop(1)
275+
.collect {
276+
if (shouldSkipBackup()) return@collect
277+
markBackupRequired(BackupCategory.METADATA)
278+
}
279+
}
280+
dataListenerJobs.add(pubkyStateJob)
281+
271282
// BLOCKTANK - Observe blocktank state changes (orders, cjitEntries, info)
272283
val blocktankJob = scope.launch {
273284
blocktankRepo.blocktankState
@@ -461,18 +472,7 @@ class BackupRepo @Inject constructor(
461472
json.encodeToString(payload).toByteArray()
462473
}
463474

464-
BackupCategory.METADATA -> {
465-
val preActivityMetadata = preActivityMetadataRepo.getAllPreActivityMetadata().getOrDefault(emptyList())
466-
val cacheData = cacheStore.data.first()
467-
468-
val payload = MetadataBackupV1(
469-
createdAt = currentTimeMillis(),
470-
tagMetadata = preActivityMetadata,
471-
cache = cacheData,
472-
)
473-
474-
json.encodeToString(payload).toByteArray()
475-
}
475+
BackupCategory.METADATA -> getMetadataBackupDataBytes()
476476

477477
BackupCategory.BLOCKTANK -> {
478478
val blocktankState = blocktankRepo.blocktankState.first()
@@ -505,6 +505,21 @@ class BackupRepo @Inject constructor(
505505
BackupCategory.LIGHTNING_CONNECTIONS -> throw NotImplementedError("LIGHTNING backup is managed by ldk-node")
506506
}
507507

508+
private suspend fun getMetadataBackupDataBytes(): ByteArray = withContext(ioDispatcher) {
509+
val preActivityMetadata = preActivityMetadataRepo.getAllPreActivityMetadata().getOrDefault(emptyList())
510+
val cacheData = cacheStore.data.first()
511+
val pubkySession = pubkyRepo.snapshotSessionBackupState().getOrDefault(null)
512+
513+
val payload = MetadataBackupV1(
514+
createdAt = currentTimeMillis(),
515+
tagMetadata = preActivityMetadata,
516+
cache = cacheData,
517+
pubkySession = pubkySession,
518+
)
519+
520+
json.encodeToString(payload).toByteArray()
521+
}
522+
508523
suspend fun performFullRestoreFromLatestBackup(
509524
onCacheRestored: suspend () -> Unit = {},
510525
): Result<Unit> = withContext(ioDispatcher) {
@@ -520,6 +535,10 @@ class BackupRepo @Inject constructor(
520535
Logger.debug("Restored caches: ${jsonLogOf(parsed.cache.copy(cachedRates = emptyList()))}", TAG)
521536
onCacheRestored()
522537
preActivityMetadataRepo.upsertPreActivityMetadata(parsed.tagMetadata).getOrNull()
538+
pubkyRepo.restoreSessionBackupState(parsed.pubkySession)
539+
.onFailure {
540+
Logger.warn("Failed to restore pubky session backup state", it, context = TAG)
541+
}
523542
Logger.debug("Restored ${parsed.tagMetadata.size} pre-activity metadata", TAG)
524543
parsed.createdAt
525544
}

0 commit comments

Comments
 (0)