fix(android): unblock protected-core startup on Android

Use flock for profile locks, hash secret record filenames under NAME_MAX,
and dismiss the starting overlay after the first init attempt.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-11 19:46:14 +02:00
parent eabc2754a7
commit 37cc238888
7 changed files with 132 additions and 28 deletions

View File

@@ -255,7 +255,7 @@ fun App(
windowChrome?.invoke()
val startingLabel = stringResource(Res.string.app_starting)
AnimatedVisibility(
visible = !sendCoreState.isInitialized,
visible = !sendCoreState.isInitialized && !appState.startupSettled,
enter = fadeIn(),
exit = fadeOut(),
) {

View File

@@ -21,6 +21,8 @@ import kotlinx.coroutines.launch
data class AppState(
val destination: AppDestination = AppDestination.Send,
val themeMode: ThemeMode = ThemeMode.System,
/** True after the first core initialize attempt finishes (success or failure). */
val startupSettled: Boolean = false,
)
class AppGraphViewModel(dependencies: AppDependencies) : ViewModel() {
@@ -46,6 +48,7 @@ class AppViewModel(
viewModelScope.launch {
val relaySettings = preferencesRepository.preferences.first().relaySettings
repository.initialize(environment.defaultCoreDataDir, relaySettings).onFailure(messages::error)
_state.update { it.copy(startupSettled = true) }
}
viewModelScope.launch {
preferencesRepository.preferences.collect { preferences ->

View File

@@ -80,6 +80,7 @@ class ViewModelsTest {
val viewModel = AppViewModel(environment(), core, preferences(), UiMessageController())
advanceUntilIdle()
assertTrue(core.state.value.isInitialized)
assertTrue(viewModel.state.value.startupSettled)
assertEquals(listOf(RelaySettings()), core.initializedRelaySettings)
viewModel.selectDestination(AppDestination.Settings)
assertEquals(AppDestination.Settings, viewModel.state.value.destination)