Re-shoot the phone screenshots, and fix what taking them exposed
verify / gate (push) Has been cancelled
verify / release (push) Has been cancelled

The phone set was two days old and predated M16-M20: nothing in it showed the copy-to picker, the
trash's window or the compress dialog. It is now eight shots (Play's maximum) taken from the signed
release build over the demo library: home, folder list, photo grid, storage usage, sort sheet,
Copy to..., the trash with its 24-hour line and Empty trash, and the compress dialog with its switch.

The shots have to stay inside the demo library, so two things were deliberately not captured: the
home screen (its library counts are the real phone's - the old AVD-shot file is kept) and the picker
one level down (it would name real folders). The picker is shot at the volume list instead.

Taking the picker shot exposed a real bug: it listed '.plainfiles-trash' among the destinations,
because unlike every other listing it did not filter hidden entries. Hidden folders are now offered
only when the listing shows hidden files, with a test for both halves.

The tablet sets are unchanged. The tablet AVDs cannot boot on this machine (no KVM) and the
phone-resized path needs more navigation work than this session had left; the checklist says so and
records what to regenerate and where.
This commit is contained in:
2026-10-18 12:23:19 +02:00
parent 2690e53662
commit f4ca5f22ae
11 changed files with 44 additions and 10 deletions
@@ -622,7 +622,10 @@ class BrowserViewModel(
} else {
runCatching { source.list(path) }.getOrDefault(emptyList())
}
entries.filter { it.isDirectory }
// Folders only, and hidden ones only when the listing shows hidden files: the picker is a
// listing, and a `.plainfiles-trash` or a `.thumbnails` folder in a copy dialog is an
// invitation to put a file somewhere it will never be seen again.
entries.filter { it.isDirectory && (_state.value.showHidden || !it.isHidden) }
.sortedWith(SortSpec().comparator)
.map { PickerFolder(path = it.path) }
}
@@ -311,6 +311,26 @@ class BrowserViewModelTest {
assertEquals(R.string.browser_internal_storage, crumb.labelRes)
}
@Test
fun `the picker leaves hidden folders out until they are asked for`() {
storage.addDirectory(root.child(".hidden-backup"))
val model = viewModel()
model.openDirectory(downloads)
model.toggleSelection(downloads.child("a.txt"))
model.startTransferTo(cut = false)
model.pickerOpen(root)
// A copy dialog is a listing: the trash folder and a `.thumbnails` folder are not destinations.
val offered = model.state.value.transferPicker!!.folders.map { it.path.name }
assertFalse(".hidden-backup" in offered)
// Showing hidden files is a statement about what the user wants to see, so the picker follows it.
model.toggleShowHidden()
model.pickerOpen(root)
assertTrue(".hidden-backup" in model.state.value.transferPicker!!.folders.map { it.path.name })
}
@Test
fun `the picker walks up to the volumes and back down`() {
val model = viewModel()