ca118f1d3bc7
add a settings cog to the vault list's action cluster, beside the trash icon. With an empty vault the list is the deck root and there is no entry-detail top bar, which is where settings/lock live — so a vault with zero entries had no route to settings at all. Verified on a freshly created empty vault: the cluster now reads Notes / health / Select / settings / trash. Also wire release signing: no signingConfig existed, so assembleRelease produced an unsigned, uninstallable APK. Keystore lives at ~/.peach-release/peach-release.jks with its password in local.properties, which .kohignore already excludes, so the key and password never enter koh history. Release installs as com.peachpasswords, separate from the debug build's com.peachpasswords.debug, so a real vault stays isolated from test data.
- time
- 2026-07-24 20:32 UTC · 3 months ago
- machine
- koh2
- agent
- claude-opus-5
- session
- settings reachable from empty vault
- parent
- 98ecce847507
↓ peach-android-ca118f1d.tar.gzatlas at this save
files changed2 files
app/build.gradle+18 −0app/src/main/java/com/peachpasswords/ui/vault/VaultListScreen.kt+11 −0app/build.gradle+18 −0
@@ -25,6 +25,23 @@2525 }2626 }2727 28+ signingConfigs {29+ release {30+ // Read from local.properties (koh-ignored) so the keystore and its31+ // password never enter version history. Absent on a machine without32+ // the key -> release build stays unsigned rather than failing.33+ def props = new Properties()34+ def f = rootProject.file("local.properties")35+ if (f.exists()) { f.withInputStream { props.load(it) } }36+ if (props.getProperty("peachStoreFile")) {37+ storeFile file(props.getProperty("peachStoreFile"))38+ storePassword props.getProperty("peachStorePassword")39+ keyAlias props.getProperty("peachKeyAlias")40+ keyPassword props.getProperty("peachKeyPassword")41+ }42+ }43+ }44+2845 buildTypes {2946 debug {3047 applicationIdSuffix ".debug"@@ -32,6 +49,7 @@3249 debuggable true3350 }3451 release {52+ signingConfig signingConfigs.release3553 minifyEnabled false3654 proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"3755 }app/src/main/java/com/peachpasswords/ui/vault/VaultListScreen.kt+11 −0
@@ -43,6 +43,7 @@4343 import androidx.compose.material.icons.rounded.Add4444 import androidx.compose.material.icons.rounded.Close4545 import androidx.compose.material.icons.rounded.Search46+import androidx.compose.material.icons.rounded.Settings4647 import androidx.compose.material3.FloatingActionButton4748 import androidx.compose.material3.Icon4849 import androidx.compose.material3.TextButton@@ -201,6 +202,9 @@201202 SortBar(202203 active = sort,203204 noteOnly = noteOnly,205+ // With an empty vault there's no entry-detail top bar, so206+ // without this the user can't reach settings at all.207+ onSettings = { onNavigate(PeachNav.Settings) },204208 onSort = vm::setSort,205209 onToggleNote = vm::toggleNoteFilter,206210 onSelectMode = vm::enterMultiSelect,@@ -459,6 +463,7 @@459463 private fun SortBar(460464 active: SortOrder,461465 noteOnly: Boolean,466+ onSettings: () -> Unit,462467 onSort: (SortOrder) -> Unit,463468 onToggleNote: () -> Unit,464469 onSelectMode: () -> Unit,@@ -494,6 +499,7 @@494499 )495500 ActionCluster(496501 noteOnly = noteOnly,502+ onSettings = onSettings,497503 onToggleNote = onToggleNote,498504 onHealth = onHealth,499505 onSelectMode = onSelectMode,@@ -505,6 +511,7 @@505511 @Composable506512 private fun ActionCluster(507513 noteOnly: Boolean,514+ onSettings: () -> Unit,508515 onToggleNote: () -> Unit,509516 onHealth: () -> Unit,510517 onSelectMode: () -> Unit,@@ -539,6 +546,10 @@539546 ClusterIcon(540547 icon = { Icon(Icons.Outlined.SelectAll, contentDescription = "Select entries") },541548 onClick = onSelectMode,549+ )550+ ClusterIcon(551+ icon = { Icon(Icons.Rounded.Settings, contentDescription = "settings") },552+ onClick = onSettings,542553 )543554 ClusterIcon(544555 icon = { Icon(Icons.Outlined.DeleteOutline, contentDescription = "trash") },