diff --git a/.github/workflows/build-scale-gateway.yml b/.github/workflows/build-scale-gateway.yml index 3768052..3106bc7 100644 --- a/.github/workflows/build-scale-gateway.yml +++ b/.github/workflows/build-scale-gateway.yml @@ -4,6 +4,9 @@ on: push: branches: - main + - develop + paths: + - 'evershelf-scale-gateway/**' workflow_dispatch: permissions: diff --git a/CHANGELOG.md b/CHANGELOG.md index e86dcfc..c960953 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,37 @@ All notable changes to EverShelf will be documented in this file. -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +The format is based on [Keep a Changelog](https://keepachangelog.com/en1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.6.0] - 2026-05-03 + +### Added +- **Dashboard skeleton loading** — Stat cards (Dispensa / Frigo / Freezer) show an animated shimmer placeholder (`…`) instead of the jarring `0` flash that appeared for 3–5 seconds before data loaded; the loading class is applied before the API call and removed atomically when data arrives +- **Webapp startup preloader** — Full-screen spinner overlay during initial app load, fades out after the dashboard is ready +- **Webapp update notification** — A dismissible top banner alerts the user when a newer GitHub release is available (checked once every 6 hours, comparison based on `published_at`) +- **Native Android update banners** — Both Kiosk (v1.4.0) and Scale Gateway (v2.1.0) show a native top bar when a newer APK is available, with one-tap download and install + +### Fixed +- **APK install conflict** — Replaced `ACTION_VIEW`-based APK install with the `PackageInstaller.Session` API (API 21+) in both Kiosk and Scale Gateway; the session-based approach correctly handles: + - `STATUS_PENDING_USER_ACTION` → automatically launches the system confirmation dialog + - `STATUS_SUCCESS` → success toast + - `STATUS_FAILURE_CONFLICT` / `STATUS_FAILURE_INCOMPATIBLE` → `AlertDialog` offering to uninstall the old app (signature mismatch) before reinstalling +- **Cooking mode z-index** — Update banner and app header are now hidden when `body.cooking-mode-active` is set, and the cooking overlay z-index was raised to `99998` so it can no longer be obscured by UI chrome +- **Version-aware error reporting** — GitHub Issues are only created when the client is running the latest released version, avoiding noise from stale deployments; non-semver tag names (e.g. `"latest"`) are treated as "always up-to-date" +- **XOR-obfuscated GitHub token** — The PAT used for GitHub API calls is stored as an XOR-encoded hex string in both the PHP backend and Kotlin apps to prevent accidental exposure via secret scanning + +### Kiosk (v1.3.0 → v1.4.0) +- FileProvider + `REQUEST_INSTALL_PACKAGES` permission added +- APK download destination moved to `getExternalFilesDir(null)` (no storage permission needed) +- `PackageInstaller` self-update with signature-conflict recovery +- BLE scale gateway update banner with download + install flow + +### Scale Gateway (v2.0.0 → v2.1.0) +- Same FileProvider + permission + `PackageInstaller` changes as Kiosk +- Update banner for self-update +- CI workflow now triggers on `develop` branch (in addition to `main`) + ## [Unreleased] - 2026-04-30 ### Fixed diff --git a/README.md b/README.md index 3b75426..483224f 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,9 @@ ## 🌍 Recent Updates +- **Dashboard skeleton loading** — Stat cards (Dispensa/Frigo/Freezer) show an animated shimmer while data loads instead of a jarring `0` flash for 3–5 seconds. +- **APK self-update with conflict recovery** — Both Kiosk (v1.4.0) and Scale Gateway (v2.1.0) use the `PackageInstaller` session API for OTA installs; a signature conflict now shows a dialog offering to uninstall the old version instead of a cryptic failure. +- **Webapp + Android update notifications** — A dismissible banner appears when a newer GitHub release is available (checked every 6 hours in the webapp; natively in the Android apps). - **Smarter low-quantity alerts** — The "suspiciously low quantity" banner is no longer raised for a partially-used entry (e.g. 191 ml of milk in the fridge) when the same product has stock in another location (e.g. 11 sealed packages in the pantry). Sibling entries are detected by barcode or name+brand. - **Non-alarmist expired banner** — The expired-product banner now adapts its icon, colour, and title to the actual safety level: green ✅ for long-life products that are still safe, amber 👀 for items that should be checked, and the original red 🚫 only for genuinely dangerous items (raw meat, dairy, fish). Low-risk products like canned tomatoes or pasta are no longer shown with a scary red banner. - Recipe and meal-plan labels now resolve at runtime from translations, preventing raw placeholders like `meal_types.*` and `meal_plan_types.*` from appearing in the UI. diff --git a/evershelf-kiosk/app/build.gradle.kts b/evershelf-kiosk/app/build.gradle.kts index f2e3b16..439f29f 100644 --- a/evershelf-kiosk/app/build.gradle.kts +++ b/evershelf-kiosk/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "it.dadaloop.evershelf.kiosk" minSdk = 24 targetSdk = 34 - versionCode = 4 - versionName = "1.3.0" + versionCode = 5 + versionName = "1.4.0" } signingConfigs { diff --git a/evershelf-scale-gateway/app/build.gradle.kts b/evershelf-scale-gateway/app/build.gradle.kts index a00c4ce..5f2835a 100644 --- a/evershelf-scale-gateway/app/build.gradle.kts +++ b/evershelf-scale-gateway/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "it.dadaloop.evershelf.scalegate" minSdk = 24 targetSdk = 34 - versionCode = 6 - versionName = "2.0.0" + versionCode = 7 + versionName = "2.1.0" } buildFeatures { diff --git a/index.html b/index.html index 4b0e6a5..7b533f9 100644 --- a/index.html +++ b/index.html @@ -61,7 +61,7 @@
-

🏠 EverShelfv1.5.0

+

🏠 EverShelfv1.6.0