Scaffold native Android build and enforce Rust boundaries (#89)
Dependency security audit / rustsec (push) Failing after 22s

This commit is contained in:
hugo committed 2026-10-08 10:16:51 +02:00
1 parent 30d9119302
commit e079b82b15
62 files changed
+5822

No files matched your search

@@ -0,0 +1 @@
<manifest />
@@ -0,0 +1,56 @@
package de.rfc1437.ironstorage.features
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.heading
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import de.rfc1437.ironstorage.core.ShellState
import de.rfc1437.ironstorage.core.ShellTab
@Composable
fun ShellScreen(viewModel: ShellViewModel) {
val snapshot by viewModel.snapshot.collectAsStateWithLifecycle()
Scaffold(
bottomBar = {
NavigationBar {
ShellTab.entries.forEach { tab ->
NavigationBarItem(
selected = snapshot.selectedTab == tab,
onClick = { viewModel.selectTab(tab) },
icon = {},
label = { Text(tab.name) }
)
}
}
}
) { padding ->
Column(
modifier = Modifier.fillMaxSize().padding(padding).padding(24.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Text(stringResource(R.string.app_name), style = MaterialTheme.typography.headlineLarge)
val page = snapshot.pages.firstOrNull { it.tab == snapshot.selectedTab }
Text(
page?.stateTitle ?: stringResource(R.string.scaffold_title),
modifier = Modifier.semantics { heading() },
style = MaterialTheme.typography.headlineSmall
)
Text(page?.detail ?: stringResource(R.string.scaffold_detail))
if (snapshot.state == ShellState.Loading) CircularProgressIndicator()
}
}
}
@@ -0,0 +1,14 @@
package de.rfc1437.ironstorage.features
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import de.rfc1437.ironstorage.core.ShellRepository
import de.rfc1437.ironstorage.core.ShellTab
import javax.inject.Inject
@HiltViewModel
class ShellViewModel @Inject constructor(private val repository: ShellRepository) : ViewModel() {
val snapshot = repository.snapshot
fun selectTab(tab: ShellTab) = repository.selectTab(tab)
}
@@ -0,0 +1,5 @@
<resources>
<string name="app_name">IronStorage</string>
<string name="scaffold_title">No Password Store</string>
<string name="scaffold_detail">Your password store has not been configured.</string>
</resources>