Four milestones from the survey's remaining gaps

M17 - the mark of a change. A dot on the rows an operation produced, spent by the
next read of that folder: in memory, per folder, no timer and no watcher. Copy,
move, compress, extract, rename (single and batch) and new folders all mark what
they made, so "what did that 4 GB copy do?" has an answer even when the copy went
to a folder the user was not looking at. The dot is drawn by MarkOfChange in the
list and the grid, with a content description, and `changed` is set by the same
state update that announces the folder.

M18 - store-only archives. Compressing now asks for the name and whether to
compress, because the survey's most enthusiastic review is a bulk copy to a
computer and that file is better stored than squeezed. Deflater.NO_COMPRESSION
keeps it one pass; a STORED entry would need size and CRC before the header,
i.e. reading every file twice.

M19 - the trash says what it does. The screen states the 24-hour window, offers
Empty trash behind one question, and opening the trash sweeps what has expired -
the window used to run only after the next delete, so an old batch could stay on
the card indefinitely. Trash.emptyAll leaves anything in that folder that is not
one of ours alone.

M20 - launcher shortcuts. Images, Recent and Trash as static shortcuts carrying
a route extra; core/ShortcutRoute answers null for anything it does not know, so
an old shortcut cannot crash a new build. Favourites was dropped from the plan:
it is a section of the home screen, not a view, so a shortcut to it would promise
something that may not be there.

M21 (Android TV) is specified in the roadmap and deliberately not started: its
acceptance needs a TV device pass this machine cannot provide.

18 new tests (427 in total). Detekt's baseline was regenerated after two
signatures gained a parameter; the diff is three findings with new signatures and
their KDoc moved above the annotations so the baseline stays readable. Verified by
the gate only so far - the device pass for these four is next, and the terminal
here has been losing command output for the last hour.
This commit is contained in:
2026-10-18 00:15:03 +02:00
parent 17078bf613
commit 5d39f4b3fb
23 changed files with 924 additions and 38 deletions
+25
View File
@@ -108,6 +108,13 @@
<string name="browser_action_copy">Copy</string>
<string name="browser_action_cut">Move</string>
<string name="browser_action_paste">Paste here</string>
<!-- Compressing: the name, and whether to squeeze the contents. -->
<string name="compress_dialog_title">Compress</string>
<string name="compress_dialog_name">Archive name</string>
<string name="compress_dialog_contents">Compress contents</string>
<string name="compress_dialog_hint">Off stores the files as they are: faster to build, and ready to copy off the phone.</string>
<string name="compress_dialog_confirm">Compress</string>
<string name="compress_dialog_cancel">Cancel</string>
<!-- The two verbs that pick the destination instead of pasting into the folder on screen. -->
<string name="browser_action_copy_to">Copy to…</string>
<string name="browser_action_move_to">Move to…</string>
@@ -125,6 +132,15 @@
<string name="browser_action_select_all">Select all</string>
<string name="browser_action_clear_selection">Clear selection</string>
<string name="browser_action_undo">Undo</string>
<!-- Launcher shortcuts: the short label is under the icon, the long one is the tooltip. -->
<string name="shortcut_images">Images</string>
<string name="shortcut_images_long">Open the Images library</string>
<string name="shortcut_recent">Recent</string>
<string name="shortcut_recent_long">Open the files you changed last</string>
<string name="shortcut_trash">Trash</string>
<string name="shortcut_trash_long">Open the trash</string>
<!-- Said by TalkBack for the dot on a row an operation has just produced. -->
<string name="browser_row_changed">New</string>
<!-- The action on a "copied to X" message: go to the folder it was copied into. -->
<string name="browser_action_show">Show</string>
@@ -139,6 +155,15 @@
<!-- ===== Trash ===== -->
<string name="trash_title">Trash</string>
<plurals name="trash_keep_for">
<item quantity="one">Deleted files are kept for %1$d hour</item>
<item quantity="other">Deleted files are kept for %1$d hours</item>
</plurals>
<string name="trash_empty_action">Empty trash</string>
<string name="trash_empty_confirm_title">Empty the trash?</string>
<string name="trash_empty_confirm_body">Everything in the trash is deleted for good. This cannot be undone.</string>
<string name="trash_empty_confirm_action">Delete for good</string>
<string name="message_trash_emptied">Trash emptied</string>
<string name="trash_empty">Nothing in the trash</string>
<string name="trash_restore">Restore</string>
<string name="trash_restore_all">Restore all</string>
+55
View File
@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Long-press the app icon: three views that are otherwise two or three taps deep.
Each shortcut is a plain intent into MainActivity carrying a route in an extra; MainActivity turns it into
ShortcutRoute and the browser opens that view once, when it appears. No permission, no database, and no
dynamic shortcuts to keep in sync with the favourites list.
-->
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:enabled="true"
android:shortcutId="images"
android:shortcutLongLabel="@string/shortcut_images_long"
android:shortcutShortLabel="@string/shortcut_images">
<intent
android:action="android.intent.action.VIEW"
android:targetClass="de.softwareapp_hb.filemanager.MainActivity"
android:targetPackage="de.softwareapp_hb.filemanager">
<extra
android:name="de.softwareapp_hb.filemanager.SHORTCUT"
android:value="images" />
</intent>
</shortcut>
<shortcut
android:enabled="true"
android:shortcutId="recent"
android:shortcutLongLabel="@string/shortcut_recent_long"
android:shortcutShortLabel="@string/shortcut_recent">
<intent
android:action="android.intent.action.VIEW"
android:targetClass="de.softwareapp_hb.filemanager.MainActivity"
android:targetPackage="de.softwareapp_hb.filemanager">
<extra
android:name="de.softwareapp_hb.filemanager.SHORTCUT"
android:value="recent" />
</intent>
</shortcut>
<shortcut
android:enabled="true"
android:shortcutId="trash"
android:shortcutLongLabel="@string/shortcut_trash_long"
android:shortcutShortLabel="@string/shortcut_trash">
<intent
android:action="android.intent.action.VIEW"
android:targetClass="de.softwareapp_hb.filemanager.MainActivity"
android:targetPackage="de.softwareapp_hb.filemanager">
<extra
android:name="de.softwareapp_hb.filemanager.SHORTCUT"
android:value="trash" />
</intent>
</shortcut>
</shortcuts>