Repository navigation
Android beta foundation: target, sync, i18n - #46
Merged
Merged
Conversation
- Bake versionCode (major*10000 + minor*100 + patch) into `version.mjs` so every tagged release derives it from VERSION; 0.4.0 opens the series. - Initialize `src-tauri/gen/android` with minSdk 29 / targetSdk 36 and the new permanent application id `com.reinaldoassis.atlas`. - Trim the default category seed to 4 finance and 5 time entries so the free tier can start inside its own limits. - Record the beta decisions (tracks, billing, gating, sync, i18n) in `docs/ANDROID-BETA.md` for the next slices.
- Android drops multicast packets unless an app holds a `MulticastLock`, so discovery would announce but never see peers. A small Tauri plugin in `gen/android` takes the lock on `sync_start` and releases it on `sync_stop`. - `sync` and the `mdns-sd` dependency are no longer compiled out on Android; the same Rust discovery code now runs on desktop and mobile. - Declare `CHANGE_WIFI_MULTICAST_STATE` in the Android manifest and document the behaviour in `docs/SYNC.md`.
- Add English messages and switch Paraglide to localStorage/preferred
language; `locale.svelte.ts` resolves an explicit choice, falls back to
en for any system language that is not Portuguese, and remounts the app
through `{#key i18n.locale}` (message functions are not reactive).
- Migrate every visible string in the Svelte tree: markup, placeholders,
aria labels, toasts, errors, empty states and the main page.
- Format dates and money through `intlLocale()` instead of a hardcoded
pt-BR, and seed categories, graph domains and boolean labels in the
language of the first boot.
- Add a guard test that fails when copy appears outside `m.*`, with an
allowlist that is now empty; extend `csp:check` to boot the app in
English and back.
- Add `plan.rs`: free limits (notes, attachments, habits, trackers, categories, graph nodes, history days), a Pro cache in `plan.json` and a seven-day grace window for offline use. Desktop is always Pro. - Enforce the limits inside the `db_batch` transaction: an over-limit batch is rolled back and returns `plan-limit:<key>:<limit>`, so DevTools cannot bypass the gate. - Add the optimistic UI guard before creating notes, habits, trackers, categories and graph nodes, plus a paywall sheet, a plan row in Settings and a seven-day cut in the history list for free users. - Cover the limit rules and the `json_extract` dependency with tests.
- Add `tauri-plugin-iap` (Billing 9) as a mobile-only dependency with a mobile-only capability, so the free desktop build never loads it. - Query localized prices from the store, purchase monthly/annual with the default offer, acknowledge immediately (Play refunds unacknowledged purchases after 3 days), restore and listen for renewals. - Record the result through `plan_set_pro`, keeping the Rust entitlement (and its seven-day offline grace) as the single source of truth. - Keep the fixed prices as a fallback while the Play products do not exist; outcomes surface as toasts (success, pending, cancelled, failure).
- Add a release signing config to the generated Gradle project, fed by the upload keystore env vars; local release builds without them stay unsigned. - Add the `Android` workflow: tag check, SDK/NDK/JDK 17, Rust targets, signed AAB and Play Developer API upload to `internal`. The signed AAB is never exposed as an artifact. - Document the Android release secrets and the upload-key ceremony in `docs/RELEASES.md`, and mark billing/pipeline done in the beta plan.
android-actions/setup-android fails while installing the obsolete `tools` package on the new cmdline-tools; the ubuntu image already has sdkmanager, so install only the platform, build-tools and NDK we need. Also bump setup-java to v5.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
First release train for the Android beta: the app builds for Android, syncs
over the LAN like the desktop, speaks English as well as Portuguese, gates the
mobile free tier in Rust and can sell the Pro subscription through Play
Billing. The Play pipeline signs the AAB and uploads it to the internal track.
What changed
tauri android initoutput committed,minSdk 29/targetSdk 36, permanent application idcom.reinaldoassis.atlas, version0.4.0 and a
versionCodederived from VERSION (major*10000+minor*100+patch).drops multicast without a
MulticastLock, so a small Tauri plugin ingen/androidtakes the lock onsync_startand releases it onsync_stop.fallback to English for any non-Portuguese system language,
Intlformattingper locale, localized seeds, and a guard test that fails on new hardcoded
copy.
csp:checkboots the app in English and back.plan.rsenforces the free limits inside thedb_batchtransaction (rollback +
plan-limit:<key>:<limit>), keeps a Pro cache with aseven-day offline grace, and the UI blocks creation early with a paywall.
History on the free plan stops at the last seven days.
tauri-plugin-iap(Play Billing 9) is a mobile-only dependency;the paywall shows localized store prices, purchases/acknowledges/restores and
listens for renewals, recording everything through
plan_set_pro.Androidworkflow runs on tags and uploads to theinternaltrack. Thesigned AAB is never published as an artifact.
docs/I18N.md,docs/ANDROID-BETA.md,docs/PLAY-STORE.md,docs/STORE-LISTING.md,docs/PRIVACY.md, Android section indocs/RELEASES.md.Verification
npm run check,npm test(264),npm run build,npm run csp:check(23/23),
cargo test(50) — all green.com.reinaldoassis.atlas.debug,versionCode 400, minSdk 29, targetSdk 36); release AAB built and signed with a
throwaway keystore to validate the Gradle signing config.
com.android.vending.BILLINGpermission andMulticastLockPluginpresent inthe APK.
Pending manual checks
purchase/restore with license testers.
atlas.reinaldoassis.com/privacyand producethe store assets.