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
2 files app/build.gradle+18 −0app/src/main/java/com/peachpasswords/ui/vault/VaultListScreen.kt+11 −0
app/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         }

view file

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") },

view file