Skip to content

Prepare 2.3.0: fix bugs found in a full source audit, clean up for re… - #86

Open
friedger wants to merge 18 commits into
mainfrom
claude/wonderful-hawking-bihgdx
Open

friedger wants to merge 18 commits into
mainfrom
claude/wonderful-hawking-bihgdx

Conversation

@friedger

Copy link
Copy Markdown
Member

…lease

Compose UI

  • Drop stale refresh() results (list/mode/store switched while loading)
  • Persist the last-used list; fall back if it was deleted
  • Reuse the catalogue item when adding (no duplicate items), as the legacy UI
  • Reload on resume (widget, legacy UI, automation, Settings changes)
  • CSV import uses the KEEP policy instead of overwriting tags/prices
  • Validate prices in the edit dialog instead of silently erasing them
  • Keep dialogs and typed text across rotation; editor state per item
  • Honor hidechecked / showprice / capitalization settings
  • Translatable strings, accessibility labels, empty state, one undo snackbar
  • Share list themes with the legacy UI (stored as "1"/"2"/"3")

CSV / provider / database

  • Persist SAF grants; catch SecurityException and runtime errors
  • Fix HandyShopper import/export crashes and non-list URIs in ConvertCsv
  • Truncate on export ("wt"); close leaked cursors
  • Fix SQL for containsfull/# and itemstores/#; no selection-arg concatenation
  • Disable WAL so the backup agent captures all data

Legacy UI

  • Move/delete items and rename/delete stores by id (rotation-safe)
  • Guard against the items cursor being reloaded
  • Fix the first-run layout chooser; opt out of edge-to-edge on all full-screen legacy activities (values-v35)

Other

  • Widget receiver not exported; per-widget settings PendingIntents
  • Harden exported ListShareSettings/automation entry points
  • Remove dead Wear module, playInternet flavor, Ant and Travis files
  • GitHub Actions build (unit tests, tstore APK, play AAB, lint)
  • versionName 2.3.0 / versionCode 100230, release notes

Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG

…lease

Compose UI
- Drop stale refresh() results (list/mode/store switched while loading)
- Persist the last-used list; fall back if it was deleted
- Reuse the catalogue item when adding (no duplicate items), as the legacy UI
- Reload on resume (widget, legacy UI, automation, Settings changes)
- CSV import uses the KEEP policy instead of overwriting tags/prices
- Validate prices in the edit dialog instead of silently erasing them
- Keep dialogs and typed text across rotation; editor state per item
- Honor hidechecked / showprice / capitalization settings
- Translatable strings, accessibility labels, empty state, one undo snackbar
- Share list themes with the legacy UI (stored as "1"/"2"/"3")

CSV / provider / database
- Persist SAF grants; catch SecurityException and runtime errors
- Fix HandyShopper import/export crashes and non-list URIs in ConvertCsv
- Truncate on export ("wt"); close leaked cursors
- Fix SQL for containsfull/# and itemstores/#; no selection-arg concatenation
- Disable WAL so the backup agent captures all data

Legacy UI
- Move/delete items and rename/delete stores by id (rotation-safe)
- Guard against the items cursor being reloaded
- Fix the first-run layout chooser; opt out of edge-to-edge on all
  full-screen legacy activities (values-v35)

Other
- Widget receiver not exported; per-widget settings PendingIntents
- Harden exported ListShareSettings/automation entry points
- Remove dead Wear module, playInternet flavor, Ant and Travis files
- GitHub Actions build (unit tests, tstore APK, play AAB, lint)
- versionName 2.3.0 / versionCode 100230, release notes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
- fastlane/metadata/android: new English and German descriptions,
  icon, German changelog; translated titles and short descriptions
  taken from the app's own translations (27 locales)
- .fdroid.yml: 2.3.0 build entry (no prebuild patching needed),
  CurrentVersion 2.3.0, description now comes from fastlane
- Remove stray quote from the Arabic app name

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
- Broken format placeholders in fa, ar and sd translations ("s%", "d%")
  crashed the widget, Convert CSV, totals and the EULA/new-version
  dialogs for those languages
- ShoppingActivity.onActivityResult calls super
- getColumnIndexOrThrow / guarded index instead of getColumnIndex (-1)
- Replace the obsolete ProGuard config (lint fatal) with the one rule
  still needed; header_percent_complete is not a format string

Verified: assemblePlayDebug, assembleTstoreRelease, bundlePlayRelease,
71 unit tests (incl. Robolectric) pass, lint has no errors other than
MissingTranslation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
- org.openintents.shopping.ShoppingActivity (the launcher component that
  home screens, list shortcuts and the widget link to) now hosts the
  Compose UI and opens the list given as intent data. The legacy View
  UI keeps only the item PICK/EDIT intents of other apps; its first-run
  layout chooser is gone.
- ListTheme mirrors the legacy themes attribute for attribute: Classic
  notepad paper (9-patch) + handwriting font, Bugdroid LCD font in upper
  case with "... OK" suffix, per-theme text sizes for the fontsize
  setting, price/checked colors, strike-through, checkbox and divider.
  The theme picker shows a live preview of each theme.
- Tap marks an item, long-press edits it (as in the legacy UI).
- Rows show units and the line price (price x quantity), matching totals.
- Edge-to-edge with adjustResize: the keyboard no longer pushes the app
  bar off screen on Android <= 14; light system-bar icons.
- ScreenshotTest renders the UIs/themes via Robolectric (-Pscreenshots).
- Release notes mention the new main screen.

Verified: 76 unit tests pass; release APK builds; checked on an API 30
emulator (launcher, add bar with keyboard).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
Every user gets an automatic Nostr account and can switch to their own
(nsec or NIP-55 signer). Events are signed by the user key and encrypted
with the per-list secret shared via QR code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
With "Search/add items in action bar" (the legacy holosearch setting,
same key, so earlier layout choices carry over) the add field moves into
the top bar: typing filters the list (and Pick items), Enter or + adds
the text as an item, suggestions show below the bar. Default stays at
the bottom for new installs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
… filter

- Shared text / INSERT_FROM_EXTRAS items are added by the new UI (they
  were dropped after the launcher switch)
- With per-store prices, saving an item no longer overwrites its own
  price with the cheapest store price (price only written when changed)
- Home-screen widgets refresh when leaving the app
- singleTop main screen; the widget reuses it instead of stacking copies
- Store chips keep a pending reload; removing the selected store clears it
- Legacy per-list tag/store filters, which the new UI cannot show, are
  cleared so they no longer hide items
- Lists created by a CSV import appear in the drawer
- CSV export writes removed items as -1 so a re-import keeps them off
  the list
- Save in the edit dialog waits until the note is loaded
- Quick double taps toggle from the stored status
- Intents can open a list created while the app was in the background
- Settings screen only lists settings the app honors
- resourceConfigurations: only the app's own languages (-270 KB)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
New UI now covers the legacy features:
- The 10 legacy sort orders (sort dialog), per-list sort, Pick items
  sort, list order in the drawer (same settings, sorted by the provider)
- Store / tag filters ("use_filters") as chips; active filters are
  always visible
- Undo for mark all, unmark all and clean up; shake to clean up
- Move to another list, copy, delete permanently, per-item stores
- Priority subtotal; show price/tags/units/quantity/priority settings
- "Use this theme for all lists"; keep screen on; orientation;
  reset quantity; reset all settings
- Menu: Convert CSV (HandyShopper, encoding, policy) and About
- Settings grouped like the legacy preferences
- Priority shown as a badge

Release:
- fastlane phone screenshots (Default, Classic, Bugdroid, top bar)
- .github/workflows/release.yml: on a v* tag build + sign the APK,
  GitHub release (Obtainium), publish to Zapstore (zapstore.yaml)
- README: install channels and release steps; UPGRADE: parity table

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
The legacy View UI (.ui.ShoppingActivity: item PICK/GET_CONTENT for other
apps), its Pick items dialog, the legacy settings screen, the dead
share-settings (GTalk) and location-alert screens and the unreachable
EULA/new-version screens are no longer in the manifest, so R8 drops
their code (-210 KB). Sort-mode constant and widget projection no
longer come from the legacy classes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
- "Compact view" setting: denser rows (no 48dp checkbox touch padding,
  less vertical padding), about three times as many items on screen
- "Fast scrolling" (legacy setting): draggable thumb at the right edge;
  tap or drag the track to jump through long lists

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
- Scan button in the add bar (bottom and top bar): scans via a scanner
  app (ZXing SCAN intent, e.g. Binary Eye; offers to install one). The
  item is found by its saved barcode, else named via Open Food Facts
  (API v2, HttpURLConnection + org.json, no new library), else the user
  names it; the barcode is stored with the item.
- Setting "Look up scanned products on Open Food Facts" (default on);
  INTERNET permission, used only for that lookup.
- Store texts no longer claim "no internet permission"; changelogs,
  screenshots (incl. compact view) and zapstore images updated.
- UPGRADE: parity table updated; the unregistered legacy sources can
  be deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
"Show barcode scan button" (default on) next to the Open Food Facts
lookup setting; hides the button in the bottom add bar and the top bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
The scan button turns into a spinner while a scanned barcode is looked up.
When Open Food Facts can't be reached, the name dialog says so instead of
just "Unknown product". Timeouts drop from 8+8 s to 3+3 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
On a v* tag the workflow now also builds the play app bundle and uploads it
with the R8 mapping and release notes to the open testing track. It is skipped
without the PLAY_SERVICE_ACCOUNT_JSON secret; an optional separate upload key
can be given with PLAY_KEYSTORE_* secrets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHYgQzNQ1UGJ4AM46CiAoG
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants