fix(android): A2/A3/A4 — APK build doc, dead refs, modal hit targets

A2: docs/ANDROID.md — remove stale "permanent fix to come" note;
    clarify --lib is the canonical command; root-cause the upstream
    cargo-apk bug. SESSION_HANDOFF.md closes the open item.

A3: Remove dead CARD_PLAN.md references from four source module
    doc comments (theme/importer.rs, theme/plugin.rs, assets/mod.rs,
    assets/svg_loader.rs). Also fix stale "future picker UI" language
    in plugin.rs (picker shipped in Phase 7).

A4: ui_modal.rs spawn_modal_button — add min_height: Val::Px(48.0)
    so every modal action button meets Material's 48 dp touch target
    minimum. Modal button height was 42 px (2×SPACE_3 + TYPE_BODY_LG);
    now clamped to 48 px minimum. Cards at 40 dp on 360 dp phones are
    layout-constrained (7 columns) and cannot be widened.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-05-12 22:55:30 -07:00
parent 24ab25b0b7
commit 859b69b3c5
7 changed files with 17 additions and 18 deletions
+2 -2
View File
@@ -72,8 +72,8 @@ Also shipped (pre-Phase 8 but post-v0.22.0, already in CHANGELOG):
hook confirmed `ClipboardManager.setPrimaryClip()` succeeds on Android 14. hook confirmed `ClipboardManager.setPrimaryClip()` succeeds on Android 14.
Hook reverted. Production path requires Interaction::Pressed + non-null `share_url`. Hook reverted. Production path requires Interaction::Pressed + non-null `share_url`.
Note: `adb shell input tap` doesn't deliver touch events on headless AVD (documented). Note: `adb shell input tap` doesn't deliver touch events on headless AVD (documented).
- **`cargo apk build --lib` noisy stderr** — post-sign panic doesn't affect the - [x] **`cargo apk build --lib` noisy stderr** — upstream cargo-apk bug; `--lib`
APK but pollutes CI output. Document `--lib` as canonical or upstream a fix. is the canonical command (CLAUDE.md §15.1, docs/ANDROID.md). No in-repo fix possible.
### 5. Feature completeness ### 5. Feature completeness
- [x] **Theme importer UI.** Done (`613bbf8`): "Scan for new themes" button in - [x] **Theme importer UI.** Done (`613bbf8`): "Scan for new themes" button in
+8 -6
View File
@@ -143,16 +143,18 @@ After the APK is signed cargo-apk panics with:
thread 'main' panicked: Bin is not compatible with Cdylib thread 'main' panicked: Bin is not compatible with Cdylib
``` ```
This happens AFTER the APK is on disk and signed. cargo-apk is This happens AFTER the APK is on disk and signed. cargo-apk tries to
trying to also wrap the desktop `[[bin]]` target. The APK is still also wrap the desktop `[[bin]]` target alongside the `[lib]`. The APK
valid. Work around with `--lib`: is valid — the panic is cosmetic. **Always use `--lib`**, which is the
canonical build command (see `CLAUDE.md §15.1`):
```bash ```bash
cargo apk build -p solitaire_app --target x86_64-linux-android --lib cargo apk build -p solitaire_app --lib
``` ```
(Permanent fix to come — likely a `[[bin]] required-features = ["desktop"]` Root cause: upstream cargo-apk bug — it does not skip `[[bin]]` targets
gate so cargo-apk skips the bin target on Android.) when building for Android. No in-repo fix is possible; `--lib` is the
accepted workaround.
--- ---
+2 -4
View File
@@ -1,10 +1,8 @@
//! Asset-loading infrastructure for runtime SVG rasterisation and the //! Asset-loading infrastructure for runtime SVG rasterisation and the
//! per-platform user-themes directory. //! per-platform user-themes directory.
//! //!
//! See `CARD_PLAN.md` for the full multi-phase implementation plan. //! Provides the SVG → `Image` loader and the `embedded://` / `themes://`
//! This module is the entry point for Phases 1 (SVG → `Image`) and 5 //! custom `AssetSource` implementations used by the theme system.
//! (user-themes directory). Phase 3 will extend it further with custom
//! `AssetSource` implementations for `embedded://` and `themes://`.
pub mod card_face_svg; pub mod card_face_svg;
pub mod icon_svg; pub mod icon_svg;
+1 -1
View File
@@ -1,6 +1,6 @@
//! Bevy `AssetLoader` that rasterises an SVG into `bevy::image::Image`. //! Bevy `AssetLoader` that rasterises an SVG into `bevy::image::Image`.
//! //!
//! The card-theme system (see `CARD_PLAN.md`) ships SVG sources both as //! The card-theme system ships SVG sources both as
//! the embedded default theme and as user-supplied themes. Bevy 0.18 has //! the embedded default theme and as user-supplied themes. Bevy 0.18 has
//! no built-in SVG support, so this loader bridges `usvg` (parser) + //! no built-in SVG support, so this loader bridges `usvg` (parser) +
//! `resvg` (renderer) + `tiny-skia` (CPU pixmap) to produce textures //! `resvg` (renderer) + `tiny-skia` (CPU pixmap) to produce textures
+1 -1
View File
@@ -1,6 +1,6 @@
//! Theme zip-archive importer. //! Theme zip-archive importer.
//! //!
//! Phase 7 of the card-theme system (see `CARD_PLAN.md`). Players ship //! Players ship
//! and install third-party themes as a single `.zip` containing a //! and install third-party themes as a single `.zip` containing a
//! `theme.ron` manifest at the archive root plus the 52 face SVGs and //! `theme.ron` manifest at the archive root plus the 52 face SVGs and
//! one back SVG referenced by that manifest. [`import_theme`] is the //! one back SVG referenced by that manifest. [`import_theme`] is the
+2 -4
View File
@@ -3,10 +3,8 @@
//! with the currently-loaded theme so existing card-rendering systems //! with the currently-loaded theme so existing card-rendering systems
//! pick up the new artwork on the next state-changed tick. //! pick up the new artwork on the next state-changed tick.
//! //!
//! Phase 4 of `CARD_PLAN.md`. The plugin's `set_theme` helper is the //! The plugin's `set_theme` helper is the public API used by the
//! public API that the future picker UI (Phase 6) calls; for now it's //! Settings appearance picker and exposed for tests.
//! exposed for tests and for any embedder that wants to load an
//! alternative theme manually.
use std::collections::HashMap; use std::collections::HashMap;
+1
View File
@@ -372,6 +372,7 @@ pub fn spawn_modal_button<M: Component>(
Button, Button,
Node { Node {
padding: UiRect::axes(VAL_SPACE_4, VAL_SPACE_3), padding: UiRect::axes(VAL_SPACE_4, VAL_SPACE_3),
min_height: Val::Px(48.0),
justify_content: JustifyContent::Center, justify_content: JustifyContent::Center,
align_items: AlignItems::Center, align_items: AlignItems::Center,
column_gap: VAL_SPACE_2, column_gap: VAL_SPACE_2,